티스토리 뷰
Spring Framwork & JPA
Lombok은 내부적으로 어떻게 getter와 setter같은 반복적인 코드들을 간결하게 작성해줄까?
DEV_GOLF 2023. 4. 18. 21:31반응형
Lombok이란?
Lombok은 자바에서 제공해주는 라이브러리로 반복적인 코드인 Getter Setter 생성자등을 어노테이션을 기반으로 생성해주며 코드 가독성을 향상시켜줍니다. (물론 어노테이션이 떡칠된 Entity를 보면 적당히 쓰는것도 필요해보입니다.)
어떻게?
Lombok은 컴파일 시점에 Annotation Processor를 사용하여 @Getter와 @Setter 같은 어노테이션이 붙은 소스를 읽어들이고 이를 기반으로 새로운 코드를 생성합니다.
순서를 보기 전 미리 알아둬야할 키워드가 있습니다.
추상 구문 트리
컴파일러는 소스 코드를 분석하고 문법에 맞지 않는 부분을 찾아내고 이를 수정하거나 오류를 보고하는데 이 과정에서 소스 코드를구문 분석할 때 생성되는게 추상 구문 트리입니다.
추상 구문 트리는 소스 코드의 구문 구조를 추상화 하여 나타낸 구조로, 프로그래밍 언어의 구문 규칙에 따라 생성됩니다.
Annotation Processor
어노테이션은 자바 소스 코드에 메타데이터를 추가하는 방법입니다. 일반적으로 컴파일러가 코드를 컴파일 할 때는 어노테이션을 무시하고 넘어가지만, Annotation Processor를 사용하면 컴파일 시점에 어노테이션을 분석하고 그에 따른 코드를 생성하거나 변경할 수 있습니다. 그 외에도 리소스 생성, 코드 검증, 구조 변경 등 다양한 작업이 가능합니다.
- java compiler는 소스 파일을 파싱하여 추상 구문 트리를 만들고 Annotation Processor에 따라 추상 구문 트리를 동적으로 수정하고 새 노드를 추가하고 마지막으로 바이트 코드를 분석 및 생성합니다.
- java compiler는 Lombok Annotation Processor에 의해 수정된 추상 구문 트리를 기반으로 Byte code를 생성합니다.
실제로 코드를 봅시다.
BoardAllResponse.java
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
public class BoardAllResponse {
private Long boardId;
private Title title;
private Content content;
private Nickname createdBy;
private LocalDateTime createdAt;
public static BoardAllResponse of(final Board board, final Nickname nickname) {
return new BoardAllResponse(board.getId(),
board.getTitle(), board.getContent(), nickname, board.getCreateTime());
}
}
BoardAllResponse.class
public class BoardAllResponse {
private Long boardId;
private Title title;
private Content content;
private Nickname createdBy;
private LocalDateTime createdAt;
public static BoardAllResponse of(Board board, Nickname nickname) {
return new BoardAllResponse(board.getId(), board.getTitle(), board.getContent(), nickname, board.getCreateTime());
}
public Long getBoardId() {
return this.boardId;
}
public Title getTitle() {
return this.title;
}
public Content getContent() {
return this.content;
}
public Nickname getCreatedBy() {
return this.createdBy;
}
public LocalDateTime getCreatedAt() {
return this.createdAt;
}
private BoardAllResponse() {
}
public BoardAllResponse(Long boardId, Title title, Content content, Nickname createdBy, LocalDateTime createdAt) {
this.boardId = boardId;
this.title = title;
this.content = content;
this.createdBy = createdBy;
this.createdAt = createdAt;
}
}
BoardAllResponse는 @Getter와 @NoArgsConstructor @AllArgsConstructor가 선언 되어있지만 자바 바이트 코드인 .class 파일엔 없어져있고 대신 그 자리에 getter와 기본 생성자 전체 생성자가 생긴걸 확인할 수 있습니다.
마침.
'Spring Framwork & JPA' 카테고리의 다른 글
AspectJ 안에서 AOP로 동작하는 Transactional을 사용하면 무슨일이 일어날까? (1) | 2023.03.25 |
---|---|
Redis INCR을 이용한 분산환경에서의 동시성 제어하기 (0) | 2023.02.13 |
Thread Local이란? (0) | 2023.01.05 |
[Redis] redis에서 get 연산이 일어나는 로직에 Transactional을 건다면? (0) | 2023.01.03 |
많은 외부 API를 호출해야 하는 상황에서 성능 개선 (with. webClient) (0) | 2023.01.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Redis
- JPA
- 백엔드
- Spring
- 면접 준비
- thread
- java
- 취준
- DevOps
- 개발
- 자바
- 동시성
- DB
- 개발자
- Kotlin
- 프로젝트
- 코드
- swarm
- IT
- 면접준비
- 코딩
- 인터뷰
- docker
- 취업준비
- 면접
- 게시판
- MySQL
- 취업
- CS
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함