-
[SpringBoot] Lombok 롬복Programming/SpringBoot 2023. 12. 7. 16:07728x90
Lombok이란 코드를 간소화해 주는 라이브러리입니다.
자바의 라이브러리로 반복되는 메소드를 Annotation을 사용해서 자동으로 작성해주는 라이브러리입니다.
Lombok을 이용해서 작성한 코드는 컴파일 과정에서 Annotataion을 이용해서 코드를 생성하고 .class에 자동 컴파일 됩니다.
Lombok 설치
프로젝트 탐색기에서 firstproject > src >build.gradle 파일에서 설정 코드를 작성합니다.
dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' }
편집기에 코끼리 모양의 새로고침 아이콘을 클릭합니다.
롬복 라이브러리가 다운로드 되는지 확인합니다.
Gradle탭을 클릭하면 롬복이 포함된 것을 확인할 수 있습니다.
Annotation
@Controller
springMVC그림을 보면, 2번 화살표인 "Handler Mapping"이라는 동작을 사용하기 위한 어노테이션이 바로 @Controller입니다.
HandlerMapping을 몇가지 종류가 존재합니다.
1. BeanNameUrlHandlerMapping : URL경로와 빈 이름을 매핑해 요청을 처리할 핸들러를 찾습니다. 2. RequestMappingHandlerMapping : @RequestMapping 어노테이션을 이용해 메서드 단위의 매핑을 수행합니다. 3. ControllerClassNameHandlerMapping : 컨트롤러 클래스 이름을 기반으로 URL을 매핑합니다. 4. SimpleUrlHandlerMapping : URL과 핸들러를 직접 매핑할 수 있도록 도와줍니다.
"RequestMappingHandlerMapping"를 집중해서 봐야합니다. "RequestMappingHandlerMapping" 은 다음과 같은 역할을 합니다.
1. 어노테이션 기반 요청 매핑 2. URL과 메서드의 연결 3. 다양한 요청 처리 지원 4. HandlerExecutionChain의 반환
여기서 1번 어노테이션 기반 요청 매핑에서 매핑할 때, @Controller어노테이션이 부착된 클래스를 찾게 되고, 그 이후에 @GetMapping과 같은 HTTP매핑 어노테이션을 찾아 해당 메서들를 실행하게 됩니다.
그렇기에 @Controller는 단순히 @Component의 역할만 하는 것이 아니라 요청의 진입점을 의미합니다.
<Request Mapping>
@GetMapping
: HTTP GET요청을 처리하기 위한 어노테이션
@PostMapping
: HTTP POST요청을 처리하기 위한 어노테이션
POST요청은 GET요청과 다르게 BODY(본문)을 가질 수 있습니다. Body에 데이터를 넣어 보낼 수 있습니다. Body의 데이터 형식은 JSON 혹은 FORM등을 사용할 수 있습니다.
@PatchMapping
: HTTP PATCH요청을 처리하기 위한 어노테이션
@DeleteMapping
: HTTP DELETE요청을 처리하기 위한 어노테이션
@Getter ,@Setter
get, set메소드를 자동으로 생성해주는 어노테이션입니다.
package com.example.firstproject.dto; import lombok.Getter; import lombok.Setter; @Getter @Setter public class userDto { private Long id; private String name; }
코드 우클릭 > generate > Getter and Setter 를 선택하면 아래 get,set메소드가 생성됩니다.
package com.example.firstproject.dto; public class userDto { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
@ToString
클래스 이름과 각 필드에 대한 값을 출력합니다. 부모 클래스에 대해도 toString을 적용시키고자 한다면 부모 클래스에 @ToString(callSuper=true)를 적용합니다.
출력을 원하지 않는 변수에는 @ToString.Exclude어노테이션을 붙여주면 출력을 제외할 수 있습니다.
package com.example.firstproject.dto; import lombok.ToString; @ToString public class userDto { private Long id; @ToString.Exclude private String name; }
코드 우클릭 > generate > ToString 를 선택하면 toString 메소드가 생성됩니다.
package com.example.firstproject.dto; public class userDto { // 생략... @Override public String toString() { return "userDto{" + "id=" + id + ", name='" + name + '\'' + '}'; } }
@NoArgsConstructor
@AllArgsConstructor
둘다 생성자 어노테이션입니다.
매개변수가 없는 기본 생성자, 모든 필드의 매개변수를 가진 기본 생성자 어노테이션 입니다.
package com.example.firstproject.dto; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @NoArgsConstructor @AllArgsConstructor public class userDto { private Long id; private String name; }
package com.example.firstproject.dto; import lombok.ToString; public class userDto { private Long id; private String name; public userDto(){} //NoArgsConstructor public userDto(Long id, String name){ //AllArgsConstructor this.id = id; this.name = name; } }
@RequredArgsConstructor
초기화되지 않은 final필드, @NonNull필드에 대한 생성자를 생성해주며 의존성을 주입받을 수 있습니다.
@NonNull필드의 경우 null check구문 또한 생성할 수 있습니다.
package com.example.firstproject.dto; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public class userDto { @NonNull private Long id; private String name; }
생성자 어노테이션은 setter메서드가 필요없는 필드에 대해서도 강제로 생성하게 되어 필드 값이 변경될 위험이 생기게 됩니다. 생성자 어노테이션은 사용하지 맙시다..
롬복을 사용하면 리팩토링이 힘들어질 수 도 있어 무분별하게 사용은 좋지 않습니다. 컴파일 과정에서 수행되어 디버깅이 어려워진다는 단점이 있습니다.
특히 생성자 어노테이션은 지양하는 방법입니다.
참고자료
코딩 자율학습 스프링부트3 자바 백엔드 개발 입문 (길벗)
728x90'Programming > SpringBoot' 카테고리의 다른 글
[CS] 웹 서비스 구조 (0) 2024.03.27 [Spring] IntelliJ JSP (0) 2024.03.25 [SpringBoot] JPA (0) 2023.12.07 [SpringBoot] MVC패턴 + REST API + JPA 프로젝트 설계 (1) 2023.12.07 [SpringBoot] Spring Container (0) 2023.12.02