티스토리 뷰
Download
projectlombok.org
lombok을 따로 다운받으실분은 위 링크로 들어가서 다운 받으시면 됩니다.
Spring Boot 처음 dependency 설정 할 때 lombok 세팅을 해준적이 있다.
오늘은 lombok의 활용에 대해서 다뤄 볼 예정이다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
mac을 기준으로 lombok lib은 /Users/jeonmin-u/.m2/repository/org/projectlombok/lombok/1.18.12에 위치한다.
.m2는 숨겨진 파일이므로 숨겨진 파일보기 설정후에 파일에 들어가면 됩니다.
폴더에 접속하여 1.18.12 jar 파일을 더블클릭하면 다음과 같이 jar 파일이 열리게 됩니다.
여기서 spectify location 버튼을 클릭하여 lombok을 설정할 tool 즉, 저는 eclipse와 stst에 적용을 했고 insall / update 버튼을 누르면 적용이 완료가 됩니다.
프로젝트에 접속하여 Member.java에 들어오면 기존에 만들어 놨던 private 변수들의 setter getter 메소드가 난잡하게 널부려져있는것을 확인할 수 있습니다. 사실 지금 하고 있는 프로젝트에서 사용하는 변수는 4개 밖에 존재하지 않아서 setter getter 메소드도 각 2개씩 총 8개밖에 없지만 변수가 늘어날수록 메소드는 더 늘어나고 코드는 가독성이 떨어지게 됩니다.
우리는 이것을 lombok 라이브러리를 활용하여 획기적으로 코드를 짜볼려고 합니다.
public class Member {
private int id;
private String username;
private String password;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Setter @Getter 어노테이션을 활용해서 위의 코드와 완전히 동일하게 작동되는 Member 객체를 만들어봤는데요..
어때요..? 정말 획기적이지 않나요..? 좀 더 활용해서 @Setter @Getter 어노테이션을 따로따로 설정해주지말고 @Data 어노테이션을 활용해 한방에 처리를 해줄 수도 있습니다!
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Member {
private int id;
private String username;
private String password;
private String email;
}
두번째는 lombok을 활용해서 builder 패턴을 생성할 수 있습니다.
빌더 패턴(Builder pattern)은 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴을 뜻합니다.
개발을 하면서 이런 경험 해본적 없나요? 생성자를 너무 많이 만들어야 하는 상황이라 자동으로 null 값을 선언해, 굳이 null 값을 선언할 필요가 없었으면 좋겠다.. 라는 경험이요
예를 들어서
public class Member {
private int id;
private String username;
private String password;
private String email;
public Member(int id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
public Member(int id, String password, String email) {
this.id = id;
this.password = password;
this.email = email;
}
}
이렇게 매개변수로 id, username, password, email을 넣어줘야될때도 있고 또는 id, password, email 을 넣어줘야되는 경우가 있을 수 있을 때 우리는 보통 생성자 메소드를 2개를 생성하여 상황에 맞게 대비해줍니다.
하지만 이렇게 되면 꼭 매개변수 순서에 맞게 값을 대입해줘야하고, 또 생성자가 많아지면 많아질수록 코드가 길어지게 됩니다.
이럴때 @Builder 어노테이션을 사용할 수 있는데요
@Data
@NoArgsConstructor // 빈 생성자
public class Member {
private int id;
private String username;
private String password;
private String email;
@Builder
public Member(int id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
}
이렇게 @Builder 어노테이션을 사용한 뒤
@GetMapping("/http/lombok")
public String lombokTest() {
Member m = Member.builder().username("ssar").password("1234").email("ssar").build();
System.out.println(TAG + "getter : " + m.getId());
m.setId(4000);
System.out.println(TAG + "setter : " + m.getId());
return "lombok test 완료";
}
Member m 객체를 열어 id를 제외한 나머지 값들을 대입했습니다. @Builder 어노테이션이 없었다면, id 값이 대입되지 않아(그에 맞는 생성자 메소드도 존재하지않음) 오류가 발생했을텐데 @Builder 어노테이션 덕분에 알아서 처리를 해주는 모습을 볼 수 있습니다.
또한 @Builder 어노테이션의 존재로 인해서 매개변수의 대입시 순서에 상관없이 뒤죽박죽 넣더라고 처리가 되는 모습을 볼 수 있습니다.
빌더 패턴의 장점
1. 객체들마다 들어가야할 인자가 각각 다를 때 유연하게 사용할 수 있다.
2. 무조건 setter 생성을 방지하고 불변객체로 만들 수 있다.
3. 필수 argument를 지정할 수 있다. (보통의 경우, PK 역할을 할 ID 값이 될 것이다.)
'JavaProject > Spring Boot' 카테고리의 다른 글
Spring Boot(JPA 영속성 컨텍스트, 더티 체킹, Update) (0) | 2022.09.12 |
---|---|
Spring Boot(data select, paging 해보기) (1) | 2022.09.10 |
Spring Boot(JPA dummy 데이터로 insert 테스트하기) (0) | 2022.09.09 |
Spring Boot(User Table 생성, MySQL) (0) | 2022.09.05 |
Spring Boot(Http1.1, Stateless, MIME) (0) | 2022.08.29 |