Spring 신경 쓰면 좋을 점

오젼·2024년 7월 19일
0

생성자 주입

@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로 매핑 시키는 게 맞음.

0개의 댓글

관련 채용 정보