Spring

[Spring] ๋กฌ๋ณต(Lombok), @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•œ ์ƒ์„ฑ์ž ์ฃผ์ž…

jeong_ii 2025. 2. 4. 15:00

๐Ÿ”น ๋กฌ๋ณต(Lombok)์ด๋ž€ ?

Lombok์€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด ์ฃผ๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

Lombok์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

 

๐Ÿ”ธ Lombok์˜ ์žฅ์ 

  • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ œ๊ฑฐ : Getter, Setter, ์ƒ์„ฑ์ž ๋“ฑ์„ ์ž๋™ ์ƒ์„ฑํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ : ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
  • ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ : ๋ฐ˜๋ณต์ ์ธ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ ์—†์ด ํ•ต์‹ฌ ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(Boilerplate Code)

  • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ž€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Java ๊ฐ™์€ ์ •์  ํƒ€์ž… ์–ธ์–ด์—์„œ๋Š” Getter, Setter, ์ƒ์„ฑ์ž, toString() ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋‹ค.
  • Lombok ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

โœ… ์˜ˆ์ œ ์ฝ”๋“œ (Lombok ์ ์šฉ ์ „) 

public class User {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

โœ… Lombok ์ ์šฉ ํ›„ (@Getter, @Setter)

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private String email;
}

์ด๋ ‡๊ฒŒ Lombok์„ ํ™œ์šฉํ•˜๋ฉด, Getter์™€ Setter๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

 

๐Ÿ”น @RequiredArgsConstructor

@RequiredArgsConstructor๋Š” final ํ•„๋“œ์™€ @NonNull์ด ๋ถ™์€ ํ•„๋“œ๋งŒ์„ ํฌํ•จํ•œ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

๐Ÿ”ธ @RequiredArgsConstructor ํŠน์ง•

  • final ๋˜๋Š” @NonNull์ด ๋ถ™์€ ํ•„๋“œ๋งŒ ํฌํ•จ๋œ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜(final ๋˜๋Š” @NonNull์ด ์—†๋Š” ๋ณ€์ˆ˜)๋Š” ์ƒ์„ฑ์ž์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Spring ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ… Lombok ์ ์šฉ ์ „

public class User {
    private final String email;
    private final String name;

    public User(String email, String name) {
        this.email = email;
        this.name = name;
    }
}

โœ… Lombok ์ ์šฉ ํ›„ (@RequiredArgsConstructor)

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class User {
    private final String email;
    private final String name;
}

Lombok์ด ์ž๋™์œผ๋กœ User(String email, String name) ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 

๐Ÿ”น ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ Lombok์„ ํ™œ์šฉํ•œ ์ƒ์„ฑ์ž ์ฃผ์ž…

1๏ธโƒฃ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ์ƒ์„ฑ์ž ์ฃผ์ž…

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•œ๋‹ค.

@Service
public class UserService {

    private UserRepository userRepository;
    private PasswordEncoder passwordEncoder;

    @Autowired
    public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }
}

@Autowired๋ฅผ ํ†ตํ•ด Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋นˆ(Bean)์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งค๋ฒˆ ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณต์ ์ด๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ final ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€

UserRepository์™€ PasswordEncoder๋Š” Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ ํ• ๋‹น๋œ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ๋ณด์žฅ๋œ๋‹ค.

@Service
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    @Autowired
    public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }
}

๐Ÿ’ก final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?

ํ•„๋“œ๊ฐ€ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ถˆ๋ณ€์„ฑ์ด ์œ ์ง€๋œ๋‹ค.

ํ•„๋“œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์—ฌ์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Lombok๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๋”์šฑ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

3๏ธโƒฃ Lombok์„ ํ™œ์šฉํ•œ ์ƒ์„ฑ์ž ์ž๋™ ์ƒ์„ฑ

์œ„์™€ ๊ฐ™์€ ์ƒ์„ฑ์ž ์ฃผ์ž… ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  ์„œ๋น„์Šค ํด๋ž˜์Šค๋งˆ๋‹ค ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋•Œ Lombok์˜ @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

}

 

๐Ÿ”ฅ Lombok + Spring์˜ ๊ฐ•๋ ฅํ•œ ์กฐํ•ฉ

@RequiredArgsConstructor๋Š” ๋ชจ๋“  final ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

Spring4.3๋ถ€ํ„ฐ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋ฉด @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ์ž๋™์œผ๋กœ ์ฃผ์ž…๋œ๋‹ค.

๋”ฐ๋ผ์„œ @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ƒ์„ฑ์ž ์ฝ”๋“œ ์—†์ด ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

๐Ÿ“ƒ reference