@Component
public class JwtTokenProvider {
@Value("${jwt.secret}")
private String jwtSecret;
@Value("${jwt.expiration}")
private long jwtExpirationInMs;
@Value("${jwt.refresh-expiration}")
private long refreshExpirationInMs;
private final UserDetailsService userDetailsService;
public JwtTokenProvider(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
public class JwtTokenProvider {
private final String jwtSecret;
private final long jwtExpirationInMs;
private final long refreshExpirationInMs;
private final UserDetailsService userDetailsService;
public JwtTokenProvider(@Value("${jwt.secret}") String jwtSecret,
@Value("${jwt.expiration}") long jwtExpirationInMs,
@Value("${jwt.refresh-expiration}") long refreshExpirationInMs,
UserDetailsService userDetailsService) {
this.jwtSecret = jwtSecret;
this.jwtExpirationInMs = jwtExpirationInMs;
this.refreshExpirationInMs = refreshExpirationInMs;
this.userDetailsService = userDetailsService;
}
1보다 2가 권장됨.
2 방식(생성자 주입, final 필드 선언)의 장점:
불변성(Immutability): final 필드는 한 번 초기화되면 변경할 수 없어 스레드 안전성을 보장.
명시적 의존성: 생성자를 통해 모든 의존성이 명시적으로 주입되므로, 클래스의 의존성을 쉽게 파악할 수 있음.
테스트 용이성: 생성자를 통해 모든 의존성을 주입받으므로, 단위 테스트 시 mock 객체를 쉽게 주입할 수 있음.
순환 의존성 방지: 생성자 주입을 사용하면 순환 의존성이 있을 경우 컴파일 시점에 오류가 발생하여 조기에 문제를 발견할 수 있음.
불변 객체 생성 가능: 모든 필드가 final이면 불변 객체를 만들 수 있어 side effect를 줄일 수 있음.
1 방식(필드 주입)의 단점:
의존성 숨김: 필드 주입은 의존성을 숨기므로, 클래스의 의존성을 파악하기 어려울 수 있음.
불변성 부족: final을 사용하지 않으면 필드가 변경될 수 있어 스레드 안전성이 보장되지 않을 수 있음.
테스트의 어려움: 필드 주입은 단위 테스트 시 의존성을 주입하기 어려울 수 있음.
https://velog.io/@cjh8746/정적-팩토리-메서드Static-Factory-Method
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
@Builder(access = AccessLevel.PRIVATE)
private User(String email, String password, String username) {
this.email = email;
this.password = password;
this.username = username;
}
public static User create(String email, String password, String username) {
return User.builder()
.email(email)
.password(password)
.username(username)
.build();
}
}
여기서 create 메서드가 아니라 from(SignupRequestDTO dto); 를 쓰면 안 될지 의문이 생김
-> https://www.inflearn.com/questions/584467/entity-메소드-파라미터로-dto를-받는-것-괜찮을까요
그러면 안 되고 dto에서 entity로 매핑 시키는 게 맞음.