Lombok , Spring Framework 어노테이션 Annotation 정리

김정현·2022년 9월 26일
0

SPRINGBOOT게시판

목록 보기
2/36

Lombok

  • Lombok 이란 Java 라이브러리로 반복되는 getter, setter, toString .. 등의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리
  • Lombok은 여러가지 @어노테이션을 제공하고 이를 기반으로 반복 소스코드를 컴파일 과정에서 생성해주는 방식으로 동작하는 라이브러리
  • 즉, 코딩 과정에서 롬복과 관련된 어노테이션만 보이고 getter,setter 등의 생략되지만 실제로 컴파일된 결과물 .class 파일에는 코드가 생성되어 있다

자주 사용되는 Lombok 어노테이션

1. 접근자/설정자 자동 생성

1)@Getter와 @Setter 특정 필드에 어노테이션을 붙여주면, 자동으로 생성된 접근자(Getter)와 설정자(Setter) 메소드 생성자 자동 생성

2)@NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성

3) @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 생성

4)@RequiredArgsConstructor 어노테이션은 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 생성

4)@NonNull 어노테이션을 변수에 붙이면 자동으로 null 체크를 해준다. 즉, 해당 변수가 null로 넘어온 경우, NullPointerException 예외를 일으켜 줍니다.

@NonNull @Setter
private String id;
obj.setId(null); // NullPointerException 발생

2. toString() 메소드 자동 생성

@ToString 어노테이션만 클래스에 붙여주면 자동으로 생성

3. equals, hashCode 자동 생성

1) @EqualsAndHashCode 어노테이션을 사용하면 자동으로 equals, hashCode 메소드를 생성할 수 있습니다.

2) @EqualsAndHashCode(callSuper = true)

    public class User extends Domain {
      private String username;
      private String password;
    }
  • callSuper 속성을 통해 equals와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있다.

  • 즉, callSuper = true로 설정하면 부모 클래스 필드 값들도 동일한지 체크하며, callSuper = false로 설정(기본값)하면 자신 클래스의 필드 값들만 고려

3. @Data
@Data는 위에서 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 매우 유용한 어노테이션

    @Data
    public class User {
      // ...
    }
  • 클래스 레벨에서 @Data 어노테이션을 붙여주면, 모든 필드를 대상으로 접근자와 설정자가 자동으로 생성되고, final 또는 @NonNull 필드 값을 파라미터로 받는 생성자가 만들어지며, toStirng, equals, hashCode 메소드가 자동 생성

@MVC에서 사용하는 주요 어노테이션

이름설명
@Controller해당 클래스가 Controller임을 나타내기 위한 어노테이션
@RequestMapping요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
@RequestParamController 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션
@ModelAttributeController 메소드의 파라미터나 리턴값을 Model 객체와 바인딩하기 위한 어노테이션
@SessionAttributesModel 객체를 세션에 저장하고 사용하기 위한 어노테이션
@RequestPartMultipart 요청의 경우, 웹요청 파라미터와 맵핑가능한 어노테이션(egov 3.0, Spring 3.1.x부터 추가)
@CommandMapController메소드의 파라미터를 Map형태로 받을 때 웹요청 파라미터와 맵핑하기 위한 어노테이션(egov 3.0부터 추가)
@ControllerAdviceController를 보조하는 어노테이션으로 Controller에서 쓰이는 공통기능들을 모듈화하여 전역으로 쓰기 위한 어노테이션(egov 3.0, Spring 3.2.X부터 추가)

@RequestMapping

  • @RequestMapping은 URL을 컨트롤러의 메서드와 매핑할 때 사용하는 스프링 프레임워크의 어노테이션
  • 클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용 URL외에도 HTTP 요청 메서드나 헤더값에 따라 매핑되도록 옵션을 제공
  • 메서드 레벨에서 정의한 @RequestMapping은 타입 레벨에서 정의된 @RequestMapping의 옵션을 상속
  • 참고로, 메서드 내에서 viewName을 별도로 설정하지 않으면 @RequestMapping의 path로 설정한 URL이 그대로 viewName으로 설정
  • 간단하게 정리하면, 클라이언트는 URL로 요청을 전송하고, 요청 URL을 어떤 메서드가 처리할지 여부를 결정하는 것이 바로 @RequestMapping

@ResponseBody

  • 클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용하여 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장한다.

  • 서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용하여 자바 객체를 HTTP 응답 본문의 객체로 변환하여 클라이언트로 전송한다.

@Component

Spring에서 관리되는 객체임을 표시하기 위해 사용하는 가장 기본적인 annotation이다. 즉, scan-auto-detection(스캔 자동감지)와 dependency injection(의존성 주입)을 사용하기 위해서 사용되는 가장 기본 어노테이션이다.

의존성 주입 용도

@Required

  • 필수 프로퍼티를 설정, 코드 내에 프로퍼티 설정 메서드에 @Required 어노테이션을 붙인다.
    @Required
    public void setName(String name) {
        this.name = name;
    }

@Autowired

  • 의존관계를 자동으로 설정해주는 어노테이션, Controller클래스에서 DAO나 Service에 관한 객체들을 주입시킬 때 많이 사용.
    @Autowired
    private DefaultBeanValidator beanValidator;

@Inject

  • 객체의 타입을 보고 주입될 클래스를 탐색한다.

  • @Autowired와 차이점은

  • @Autowired는 스프링에서 지원하고, @Inject은 자바에서 지원하는 어노테이션이다.

컨트롤러 관련

@Controller

  • @Controller어노테이션은 MVC패턴에서 Controller클래스에 선언, @Component어노테이션을 써도 상관없다.

  • 하지만 @Controller 어노테이션을 사용함으로 @RequestMapping 등의 추가 어노테이션을 사용 가능

  • @RequestMapping 어노테이션을 해당 어노테이션 밑에서만 사용할 수 있다.

    @Controller
    public class AdmController { 

@RequestMapping

  • http request로 들어오는 url 특정 controller 클래스나 메서드로 연결시키는 역할

  • controller에 class에 적용할 수 있고 특정 method에 적용 가능

    @RequestMapping(value="/adm")
    public class AdmController {

@PathVariable

  • URL 경로에 변수를 넣어주는 기능
    @RequestMapping(value="/{page}")
    public String onlyPageFowarding(@PathVariable String page,Model model){
        return "ttest/adm/"+page;
    }

@ResponseBody

  • 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할을 함

@RequestBody

  • @RequestBody에 붙은 파라미터는 HTTP 요청의 본문 body부분이 자바 객체 그대로 전달
    @RequestMapping(value="/bi200.do")
    @ResponseBody
    public Map<String, Object> exSelect (
        @RequestBody List<HashMap<String, String>> exc,

웹페이지에서 json으로 request 한 파라미터들을 java에서 받으려면 java object로의 변환이 필요하며

마찬가지로 response 시에도 java object에서 json으로 변환이 필요하다.

이러한 작업들을 해주는 어노테이션이 바로 @RequestBody와 @ResponseBody이다.

컨트롤러에 두 어노테이션을 추가해주면, JSON이나 key/value 방식 xml 등으로 송수신할 수 있다.

@RequestParam

  • 단일 HTTP 요청 파라미터를 method 파라미터에 넣어주는 어노테이션

  • 가져올 요청 파라미터 이름을 @RequestParam 어노테이션의 기본값으로 지정해주면 된다.

@RequestMapping(value="/admUpdateView.do", method=RequestMethod.POST)
public @ResponseBody Map<String, Object> adm03UpdateView(
	@RequestParam("unId") String unId,
	@ModelAttribute("searchVO") UserDefaultVO userSearchVO,

@ModelAttribute

  • @RequestParam과 비슷하고

  • Controller 메소드의 파라미터나 리턴 값을 Model 객체와 바인딩하기 위한 어노테이션

데이터 접근 관련

@Service

  • Service 레이어 클래스들에 사용되는 어노테이션, @Component어노테이션을 써도 상관없다.

  • @Service어노테이션을 사용함으로써 해당 클래스가 서비스 레이어 클래스라는 것을 명확히 함

@Service("admService")
public class AdmServiceImpl extends EgovAbstractServiceImpl implements AdmService {  

@Repository

  • DAO에 특화된 어노테이션, @Component어노테이션을 써도 상관없다.

0개의 댓글