Java๋ก ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด getter, setter, constructor์์ฑ ๋ฑ์ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค. Lombok์ ์ด๋ฌํ ๊ธฐ๊ณ์ ์ธ ์ฝ๋๋ค์ ์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ์๋ํํ์ฌ ์์ฑํด์ฃผ๋ Java์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ ๋ IntelliJํ๊ฒฝ์์ ํ์ต์ ํ๊ณ ์๊ธฐ์ IntelliJ๊ธฐ์ค์ผ๋ก ์ค๋ช ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
IntelliJ์์ Lombok์ ์ฌ์ฉํ ํ๊ฒฝ์ ๋ง๋ค๋ ค๋ฉด ํ๋ก์ ํธ ์์ฑ์์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด Developer Tools์ ์์นํ Lombok์ ์ ํํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ ํ๋ก์ ํธ ์์ฑ์์ ์ถ๊ฐ๋ฅผ ํ์ง ๋ชปํ์์ ๊ฒฝ์ฐ build.gradle์ dependencies์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ ํ dependency update๋ฅผ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
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;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
}
Lombok์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ฐ๋ฆฌ๋ User class์์ getter์ setter ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ด ๋ณ์ ํ๋์ฉ ์ ์ธ์ ํด์ค์ผํ๋ค. ์์ User class์์๋ ๋ณ์๊ฐ 4๊ฐ๋ฐ์ ์์ด๋ getter, setter๋ฅผ ๋ง๋๋๋ฐ์๋ง 8๊ฐ์ ๋ฉ์๋๊ฐ ๋ง๋ค์ด์ก์ผ๋ ์ค์ DTO๋ฅผ ์์ฑํ๋ค๋ณด๋ฉด ํจ์ฌ ๋ ๋ง์ ๋ณ์๋ค์ ๋ง๋ค๊ฒ ๋ ๊ฒ์ด๊ณ ๊ทธ์ ๋ฐ๋ผ ์ ์ธํ๋ ๋ฉ์๋์ ์๋ ํฌ๊ฒ ๋์ด๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ์ฝ๋๋ค์ Lombok์ @Getter, @Setter ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋จ์ํ ์ํฌ ์ ์๋ค.
@Getter
public class User {
@Setter
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
}
@Getter, @Setter๋ class์ ์ฒด์ ํ ์๋ ์์ผ๋ฉฐ ํน์ ๋ณ์์๋ง ์ง์ ํ ์๋ ์๋ค.
ํน์ ๋ณ์์ ๋ํด์๋ง ์ง์ ํ ๊ฒฝ์ฐ ์์ name์์ ์์นํ @Setter์ฒ๋ผ ๋ณ์ ์์ ์ง์ ํ๋ฉด ๋๋ค.
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
'}';
}
}
toString์ ๊ฒฝ์ฐ๋ Overriding์ ํ๋ฉฐ ์๋ก ์ง์ ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์์ผ๋ Lombok์ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด @ToString ์ด๋
ธํ
์ด์
์ ๋ถ์์ผ๋ก์ ๋จ์ํ์ํฌ ์ ์๋ค.
@ToString(exclude = "regionMoneyName")์ ๊ฐ์ด ํน์ ๋ณ์๋ฅผ ์ ์ธ์ํฌ ์๋ ์๋ค.
@ToString
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
}
parameter์์ด ์์ฑ๋๋ ๊ธฐ๋ณธ constructor๋ฅผ ์์ฑํด์ฃผ๋ annotation์ด๋ค.
@NoArgsConstructor
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
// public User() { } ํด๋น ์ฝ๋๊ฐ ์๋ต๋๋ค.
}
User user = new User();
@NoArgsConstructor๊ฐ ์๋ฌด๋ฐ ๋ณ์๋ฅผ ๋ฐ์ง ์๋ Constructor๋ฅผ ๋ง๋ค์ด์ฃผ๋ Annotation์ด์๋ค๋ฉด @AllArgsConstructor์ ๊ฐ์ฒด๊ฐ ๊ฐ๊ณ ์๋ ๋ชจ๋ ๋ณ์๋ฅผ ๋ฐ๋ constructor๋ฅผ ๋ง๋ค์ด์ค๋ค.
@AllArgsConstructor
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
// ์๋์ constructor๋ฅผ @AllArgsConstructor์ด ๋์ ๋ง๋ค์ด์ค๋ค.
// public User(String name, String email, LocalDateTime createdAt, LocalDateTime updatedAt) {
// this.name = name;
// this.email = email;
// this.createdAt = createdAt;
// this.updatedAt = updatedAt;
// }
}
๊ผญ ํ์ํ ๋ณ์๋ง์ ์ฌ์ฉํ๋ construtor๋ฅผ ๋ง๋ค์ด์ฃผ๋ annotation์ด๋ค. ํ์์ ์ผ๋ก ์ฌ์ฉ๋์ผํ๋ ๋ณ์๋ค์ @NonNull์ ๋ถ์ฌ์ ์ค์ ํ๋ค. ์๋๋ฉด ํด๋น ๋ณ์๋ฅผ final๋ก ์ ์ธํด๋ ์์กด์ฑ์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
@RequiredArgsConstructor
public class User {
@NonNull // @RequiredArgsConstructor์์ ์ฌ์ฉ๋ field๋ค์ ์ง์
private String name;
@NonNull
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
// public User(String name, String email) {
// this.name = name;
// this.email = email;
// }
}
equals method์ hashcode method๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋ค. ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด์์ ํน์ ๋ณ์์ ์ด๋ฆ์ด ๋๊ฐ์ ๊ฒฝ์ฐ ๊ฐ์ ๊ฐ์ฒด๋ก ํ๋จ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ๋๋ค.
@EqualsAndHashCode(of = {"name", "email"})
public class User {
private String name;
private String email;
private LocalDateTime createdAt; // ์์ฑ๋ ์๊ฐ
private LocalDateTime updatedAt; // ์
๋ฐ์ดํธ๋ ์๊ฐ
}
์์ ์ฝ๋์์๋ ๋ค๋ฅธ ๊ฐ์ฒด์์๋ name, email๊ฐ ๋์ผํ๋ค๋ฉด ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์ํ๊ฒ ๋ค~๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
entity๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ค์ต์ ํ ๋๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
@Data๋ @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.๋ฅผ ๋ชจ๋ ํฌํจํ๋ annotaion์ด๋ค. ํ์ง๋ง ์ค๋ฌด์์๋ ๋๋ฌด ๋ฌด๊ฒ๊ณ ๊ฐ์ฒด์ ์์ ์ฑ์ ์งํค๊ธฐ ๋๋ฌธ์ @Data์ ํ๋์ ์ง์ํ๋ค๊ณ ํ๋ค.
๋ค์์ ํ๋๋ฅผ ๊ฐ์ง๋ ๋ณต์กํ ํด๋์ค์ ๊ฒฝ์ฐ, ์์ฑ์ ๋์ ์ ๋น๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
@AllArgsConstructor์ ๋น์ทํ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ณ์๊ฐ์ ์ฃผ์
ํด์ฃผ๋๋ฐ ๊ฐ์ฒด์ ์์ฑ์ builder์ ํ์์ผ๋ก ์ ๊ณตํด์ค๋ค. @Builder๋ ๋ชจ๋ ๋ณ์๋ค์ ๋ํด์ buildํ๊ธฐ๋ฅผ ์ํ๋ฉด Class์์ ๋ถ์ด๊ณ ํน์ ๋ณ์์ ๋ํด buildํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์์ฑ์๋ฅผ ์์ฑํ๊ณ ๊ทธ ์์ annotation์ ๋ถ์ฌ์ค๋ค.