Spring

[Spring] @AllArgsConstructor, @RequiredArgsConstructor μ‚¬μš©μ„ μ§€μ–‘ν•œ 이유

DAHLIA CHOI 2024. 3. 5. 18:02

 

 

인턴 μƒν™œμ„ ν•˜λ©΄μ„œ @AllArgsConstructor, @RequiredArgsConstructor 이 두 μ–΄λ…Έν…Œμ΄μ…˜μ„ λ³Έ 적이 μ—†μ—ˆλŠ”λ°, κ·Έλƒ₯ μ‚¬μš©μ„ μ•ˆν•˜λŠ”κ±°κ΅¬λ‚˜λΌκ³ λ§Œ μƒκ°ν–ˆμ—ˆλ‹€. κ·Έλž˜μ„œ 이번 ν”„λ‘œμ νŠΈμ—μ„œλ„ μ‚¬μš©μ„ μ§€μ–‘ν•˜κ³  μžˆμ—ˆλŠ”λ° 문뜩 μ™œ μ§€μ–‘ν• κΉŒλΌλŠ” 의문이 λ“€μ—ˆλ‹€!

 

일단 spring diλΆ€ν„° μž‘μ„±ν•˜μžλ©΄!

 

Spring DIλž€?

DIλŠ” μŠ€ν”„λ§ 핡심 기술이라고 μƒκ°ν•˜λŠ” μ˜μ‘΄μ„± μ£Όμž…μ΄λ‹€. κ°μ²΄λ“€κ°„μ˜ μ˜μ‘΄μ„±μ„ 쀄이기 μœ„ν•΄ μ‚¬μš©λ˜λŠ” μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆμ˜ ꡬ체적인 κ΅¬ν˜„λ°©μ‹μ„ λ§ν•œλ‹€. μ˜μ‘΄μ„± μ£Όμž…ν•˜λŠ” λ°©λ²•μ—λŠ” μƒμ„±μž μ£Όμž…, ν•„λ“œ μ£Όμž…, setter μ£Όμž… μ„Έκ°œκ°€ μ‘΄μž¬ν•˜λŠ”λ° κ·Έ μ€‘μ—μ„œ μŠ€ν”„λ§μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜κ³  ꢌμž₯ν•˜λŠ” 방식은 μƒμ„±μž μ£Όμž…μ΄λ‹€.

 

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired // μƒμ„±μžκ°€ ν•˜λ‚˜λ§Œ μžˆμ„ κ²½μš°μ—λŠ” μƒλž΅ κ°€λŠ₯
    public UserService(UserRepository userRepository, MemberService memberService) {
        this.userRepository = userRepository;
    }

}

 

μ΄λŸ°μ‹μœΌλ‘œ μ“°λ©΄ λœλ‹€.

 

ν•˜μ§€λ§Œ 이런 방식을 μŠ€ν”„λ§μ—μ„œλŠ” @AllArgsConstructor, @RequiredArgsConstructor 이 μ–΄λ…Έν…Œμ΄μ…˜ ν•˜λ‚˜λ§ŒμœΌλ‘œ μƒμ„±μž μ£Όμž…μ„ 일일이 해주지 μ•Šμ•„λ„ λœλ‹€.

 

DTOμ—μ„œ @AllArgsConstructor μ‚¬μš©ν•˜κ²Œ 되면 전체 νŒŒλΌλ―Έν„°λ₯Ό κ°€μ§€λŠ” μƒμ„±μž 선언을 ν•  수 있고, Controller와 Serviceμ—μ„œλŠ” @RequiredArgsConstructor이걸 μ‚¬μš©ν•΄μ„œ μƒμ„±μž 선언을 κ°„κ²°ν•˜κ²Œ ν•˜λ©΄μ„œ DIκ°€ 될 수 μžˆλ„λ‘ ν•œλ‹€.

 

근데 이 μ‚¬μš©μ„ 지양해야 ν•˜λŠ” μ΄μœ κ°€ μžˆλ‹€κ³  ν•œλ‹€

@Getter
@AllArgsConstructor
public class Member {

    public String email;

    public String nickname;
 }

 

ν•΄λ‹Ή 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같은 생성 방식을 μ‚¬μš©ν•˜κ²Œ λ˜λŠ”λ°

Member member = new Member("email", "nickname");

 

λ§Œμ•½ λ³€μˆ˜ μ„ μ–Έ μˆœμ„œλ₯Ό μ•„λž˜μ™€ 같이 λ°”κΏ¨λ‹€κ³  쳀을 λ•Œ μˆœμ„œκ°€ λ°”λ€Œμ—ˆμ–΄λ„ 객체 μƒμ„±μ—λŠ” λ¬Έμ œκ°€ μ—†κ²Œ 되고 κ²°κ΅­ 잘λͺ»λœ 객체가 생성될 κ°€λŠ₯성이 있게 λœλ‹€.

@Getter
@AllArgsConstructor
public class Member {

    public String nickname;

    public String email;
 }

 

 

λ”°λΌμ„œ λ‚˜λ„ DTOμ—λŠ” ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš© μ•ˆν•˜κ³  @Getter와 @Builder만 μ‚¬μš©ν•˜κ³  μžˆλ‹€!

근데 생각해보면 Controllerλ‚˜ Serviceμ—μ„œ  @RequiredArgsConstructorλ₯Ό μ‚¬μš©ν•΄λ„ λ¬Έμ œκ°€ μ—†λŠ”κ±° μ•„λ‹Œκ°€λΌλŠ” 생각을 ν•΄μ„œ μ°Ύμ•„λ΄€λ‹€.

 

[μΈν”„λŸ°]@AllArgsConstructor, @RequiredArgsConstructor μ‚¬μš©κΈˆμ§€λ₯Ό κΆŒν•˜λŠ” 글을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή 글을 보면 κΉ€μ˜ν•œ κ°•μ‚¬λ‹˜μ€ @AllArgsConstructor μ‚¬μš©μ€ μ§€μ–‘ν•˜μ§€λ§Œ @RequiredArgsConstructorλŠ” μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  ν•œλ‹€! 

 

근데 λ‚˜λŠ” 일단은? λ‹€λ₯Έ κ³³μ—μ„œλ„ μ € μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ‹ˆκΉŒ 일관성을 μœ μ§€ν•˜λ €κ³  μ‚¬μš©μ„ μ•ˆν•˜κΈ°λ„ ν•˜κ³ , μ½”λ“œλ₯Ό 더 꼼꼼히 μ²΄ν¬ν•˜λŠ” 버릇을 듀이기 μœ„ν•΄μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠκΈ°λ‘œ ν–ˆλ‹€!!