[Spring] ๋กฌ๋ณต(Lombok), @RequiredArgsConstructor๋ฅผ ์ฌ์ฉํ ์์ฑ์ ์ฃผ์
๐น ๋กฌ๋ณต(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