@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
AUTO : JPA가 DB 방언에 맞게 자동 선택
IDENTITY : DB의 Auto Increment 기능 사용 (MYSQL 등)
과정
User u = new User("민상");
em.persist(u);
JPA → DB insert SQL 즉시 실행
insert into user (username) values ('민상');
DB가 PK 값 생성 (AUTO_INCREMENT)
예: id = 1
id = 1
u.getId(); // 1
SEQUENCE : DB의 시퀀스 오브젝트 사용 (Oracle, PostgreSQL 등)
TABLE : 별도 키 생성용 테이블을 만들어서 관리
SWQUENCE 방식
특징
장점
단점
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq_gen")
@SequenceGenerator(
name = "user_seq_gen", // JPA에서 부를 이름
sequenceName = "user_seq", // 실제 DB 시퀀스 이름
allocationSize = 1 // 증가 단위
)
private Long id;
private String username;
public User() {}
public User(String username) { this.username = username; }
public Long getId() { return id; }
public String getUsername() { return username; }
}
Spring Security+ JWT
회원가입
로그인
JwtTokenProvider
@Component
public class JwtTokenProvider{
private final String secretKey = "secret";
private final long validity = 3600000;
public String createToken(String username, Collection<? extends GrantedAuthority> roles){
Claim claims = Jwts.claims().setSubject(username);
claims.put("roles", roles.stream().map(GrantedAuthority :: getAuthority).toList());
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date())
.setExpiration(new Date(System,currentTimeMillis() + validity))
.signWith(SignatureAlgorithm.HS256, secretKey.getBytes())
.compact();
}
public boolean validateToken(String token){ /* JWT 검증 */ }
public String getUsername(String token){ /* JWT에서 사용자 조회 */ }
}
JwtAUthenticationFilter
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException{
String token = req.getHeader("Authorization");
if(token !=null && token. startsWith("Bearer ")){
token = token.substring(7);
if(jwtTokenProvider.validateToken(token)){
Stirng username = jwttokenProvider.getUsername(token);
UserDetails user = userDetailsService.loadUserByUsername(username);
SecurityContextHolder.getContext()
.setAuthentication(new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()));}
}
chain.doFilter(req, res);
}
}
필터 특징
SecurityConfig
@Bean
SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilter jwtFilter) throws Exception{
http.csrf(csrf -> csrf.disable())
.sessionManageMent(sm -> sm.sessionCreationPolicy(SessioncreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth.requestMatchers("/auth/**").permitAll()
.anyRequest().authenticated())
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
}
Spring Security + QAuth 2