어노테이션이란?

주석이라는 사전적 의미를 가지고있으며 , 자바 코드에 주석처럼 사용하여 컴파일 또는 런타임에서 해석된다.

 

 

 

 

 

 

 

 

"스프링 부트" 어노테이션 종류 ★ ★

0. @Bean

객체를 의미. Spring container에 bean을 등록하도록 하는 어노테이션
- @bean과 @component 차이점
@bean : 개발자가 직접 제어 불가능한 외부 라이브러리등을 만들 떄 사용
@component : 개발자가 직접 작성한 class를 bean으로 등록하기 위해 사용

 

 

 

 

 

1. @SpringBootApplication

- @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.

 

 

-

 

 

-

많은 Spring Boot 개발자들은 항상 그들의 메인 클래스에 @Configuration, @EnableAutoConfiguration 그리고 @ComponetScan을 어노테이트한다. 이 어노테이션들은 자주 함께 사용된다. Spring Boot는 편의를 위해 @SpringBootApplication을 제공한다. @SpringBootApplication 어노테이션은 @Configuration, @EnableAutoConfiguration 그리고 @ComponentScan을 디폴트 속성으로 함께 사용하는 것과 같다.

 

 

 

 

 

 

2. @Configuration

- @Configuration은 설정을 위한 어노테이션으로 개발자가 생성한 class를 Bean으로 생성 할 때 Single Tone으로 한번만 생성한다.

 

 - @Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 빈을 부를 수 있다.

 

 

 

 

 

 

0. @ServletComponentScan

서블릿컴포넌트(필터,서블릿,리스너)를 스캔 및 등록하며 이 과정은 내장 웹서버를 사용하는 경우에만 동작.
필터 = @WebFilter 서블릿=@WebServlet 리스너=@WebListener

 

 

 

 

 

3. @Component - (1차 설명)

- Spring이 관리하는 모든 component에 대한 기본 스테레오타입. Class를 bean으로 등록

 

- @Component는 Bean을 생성 할 때 java에서 new로 생성하듯이 생성한다.

- @ComponentScan 선언에 의해 특정 패키지 안의 클래스들을 스캔하고 @Component 어노테이션이 있는 클래스들에 대하여 빈 인스턴스를 생성한다.

 

(참고)

@Component -> (구체화) -> @Controller, @Service, @Repository

 

 

 

 

4. @ComponentScan

- 지정한 위치 이하에 있는 @Component와 @Configuration이 붙은 class를 스캔해서 Bean으로 등록한다.

 =

@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation

- ApplicationContext.xml에 <bean id="jeongpro" class="jeongpro" /> 이런식으로 xml에 bean을 직접등록하는 방법도 있고 위와 같이 애노테이션을 붙여서 하는 방법도 있음

- 스프링 XML 설정의 <context:component-scan>을 대신해서 자바에 설정

 

 

 

 

 

5. @Controller, @Service, @Repository

- @Component 어노테이션과 마찬가지로 빈으로 등록

 

- 해당 클래스Controller, Service, Repository로 사용됨을 프레임워크에 알린다.

 

 

 

 

6. @EnableAutoConfiguration

- 스프링 어플리케이션 컨텍스트(Application Context)를 만들 때 자동으로 설정 하는 기능을 켠다.

 

- 사용자가 필요할 것 같은 빈(bean)을 추측해서 ApplicationContext를 만들 때 필요한 설정을 한다. 클래스패스(classpath)를 기준으로 설정을 한다. 예를들어 클래스패스에 tomcat-embeded.jar이 있으면 TomcatEmbeddedServletContainerFactory가 있을 것이라고 추측 해서 설정을 해준다.

 

- classpath의 내용에 기반해서 자동 생성해준다. 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting된다.

 

 

 

 

7. @Component - (2차 설명)

@Component에 속한 @Repository,@Service,@Controller

 

1. "@Component 어노테이션"자바 클래스를 스프링 빈이라고 표시하는 역할을 한다.

이 어노테이션을 사용함으로써 스프링의 component-scanning 기술이 이 클래스를 어플리케이션 컨텍스트에 빈으로 등록하게 된다. 

 

2. "@Repository 어노테이션"DAO에 특화된 어노테이션이다.

@Component 어노테이션을 써도 상관없지만, DAO 클래스들에 @Repository 어노테이션을 사용함으로써 @Component 어노테션이 가진 특성과 함께, DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있는 장점 또한 갖을 수 있다.

 

3. "@Service 어노테이션"서비스 레이어 클래스들에 사용되어지는 어노테이션이다.

역시나 @Component 어노테이션을 사용해도 상관없다.

@Service 어노테이션을 사용함으로써 해당 클래스가 서비스 레이어 클래스라는 것을 명확하게 할 수 있다. 현재는 @Repository 어노테이션 처럼 추가적인 behavior는 없지만, 추후에 추가될 예정이다.

- 서비스 객체임을 명시. Classpath스캔을 통해 자동으로 감지됨.

 

4. "@Controller 어노테이션"MVC 패턴에서 Controller 클래스에 선언되어진다.

이 또한 @Component 로 대체할 수 있다. 하지만, @Controller 어노테이션을 사용함으로써 @RequestMapping 등의 추가적인 어노테이션을 사용할 수 있게 된다.

- 컨트롤러 객체임을 명시. Classpath 스캔을 통해 자동으로 감지된다.

 

실제 프로젝트에서 @Component가 필요한 비슷한 상황들을 직면하곤 한다.

 

하지만, 대부분의 상황에서 우리는 @Repository, @Service, @Controller 어노테이션을 사용하는게 좋다.

 

@Component 어노테이션은 Controller, Service, Dao 세가지 카테고리 이외의 클래스에만 사용해야 한다.

 

 

 

 

 


 

 

0. @Value

properties에서 값을 가져와 적용할 떄 사용

@Value("${value.from.file}")

private String valueFromFile; 이라고 구성되어 있으면 value.from.file의 값을 가져와서 해당 변수에 주입해준다.

 

spEL을 이용해서 조금 더 고급스럽게 쓸 수 있다.

@Value(#{systemProperties['priority'] ?: 'some default'})

 

 

 

 

 

 

0. @Valid

- 유효성 검증이 필요한 객체임을 지정한다.

 

 

 

 

 

 

0. @Resource

@Autowired와 마찬가지로 빈 객체 주입을 해주는데, 차이점은 autowired는 타입으로, resource는 이름으로 연결해준다.

 

 

 

 

0. @PostConstruct, @PreConstruct

- 의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에(pre/post) 실행해야 할 메소드 앞에 붙인다.

 

 

 

 

 

0. @PreDestroy

- 객체를 제거하기 전(pre)에 해야할 작업을 수행하기 위해 사용한다.



 

 

 

 

0. @Mapper

mybatis 어노테이션으로 interface클래스를 통해 sql을 컨트롤 할 수 있음.

 

 

 

 

 

 

 

8. @RequestMapping(value(default), method)

 

(1차 설명)

요청 url을 어떤 메서드가 처리할 것인지 매핑해주는 어노테이션
라우팅정보를 제공하며 선언한 경로의 값에 따라 HTTP 요청이 해당 메서드에 매핑되어야 하는 것을 스프링에 알림.

 

 

(2차 설명)

@RequestMapping에 대한 모든 매핑 정보는 스프링에서 제공하는 HandlerMapping 클래스가 가지고 있다.

value: 해당 url로 요청이 들어오면 이 메서드가 수행

method: 요청 method를 명시, 없으면 모든 http method형식에 대해 수행

1. 클래스 레벨 매핑

- 모든 메서드에 적용되는 경우

2. 핸들러(메서드) 레벨 매핑

- 해당 메서드에만 적용되는 경우

 

 

(3차 설명)

요청 URL을 어떤 메서드가 처리할지 mapping해주는 애노테이션이다.

컨트롤러나 컨트롤러의 메서드에 적용한다.

@RequestMapping("/list"), @RequestMapping("/home, /about");

@RequestMapping("/admin", method=RequestMethod.GET)

 

 

 

 

 

 

 

 

0. @GetMapping, @PostMapping

@GetMapping

- - ->@RequestMapping(Method=RequestMethod.GET)과 같음. 

- - -> Http head에 담아 보내기 때문에 용량제한있음

( 참고 - @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping은 유추 가능함. )

 

@PostMapping

- - -> 등록할 때 사용. Http body에 담아 보냄

 

 

 

 

 

 

 

0. @RequestAttribute

- Request에 설정되어 있는 속성 값을 가져올 수 있다.

 

 

 

 

 

 

 

 

0. @ModelAttribute

- view에서 전달해주는 파라미터클래스(VO/DTO)의 멤버 변수binding 해주는 애노테이션

 

바인딩 기준은 <input name="id" /> 처럼 어떤 태그의 name값이 해당 클래스의 멤버 변수명과 일치해야하고 set메서드명도 일치해야한다.

 

class Person{

      String id;

      public void setId(String id){ this.id = id;}

}

 

 

 

 

 

 

 

0. @SessionAttributes

- 세션에 데이터를 넣을 때 쓰는 애노테이션

@SessionAttributes("name")이라고 하면 Model에 key값이 "name"으로 있는 값은 자동으로 세션에도 저장되게 한다.



 

 

 

 

 

0. @CookieValue

- 쿠기 값을 파라미터로 전달 받을 수 있는 방법

해당 쿠기가 존재하지 않으면 500 에러를 발생시킨다.

속성으로 required가 있는데 default는 true다. false를 적용하면 해당 쿠키 값이 없을 때 null로 받고 에러를 발생시키지 않는다.

public String view(@CookieValue(value="auth")String auth){...}; // 쿠키의 key가 auth에 해당하는 값을 가져옴



 

 

 

 

 

0. @PutMapping

수정할 때 사용

 

 

 

 

 

 

9. @RestController - (1차 설명)

- @Controller + @ResponseBody 를 합친 어노테이션으로 메소드의 반환 결과를 JSON 형태로 반환한다.

 

- @Controller@RestController의 차이
@Controller - api와 view를 동시에 사용하는 경우에 사용. View return이 주 목적
@RestController - view가 필요없는 api만 지원하는 서비스에서 사용(Spring 4.0.1부터 제공)

 

- @Controller @RestController의 차이

 

 

 

 

 

 

 

 

0. @ResponseBody

- "view가 아닌 JSON 형식의 값을 응답할 때 사용하는 애노테이션"으로 문자열을 리턴하면 그 값을 http response header가 아닌 response body에 들어간다.

만약 객체를 return하는 경우 JACKSON 라이브러리에 의해 문자열로 변환되어 전송된다.

context에 설정된 resolver를 무시한다고 보면된다. (viewResolver)

 

 

 

 

 

 

 

10. @Autowired

@Autowired어노테이션은 이름을 보면 알 수 있듯이 이 어노테이션을 부여하면 각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입해주게 됩니다.

 

 

 

 

0. @Override

상위클래스에서 오버라이드한 메소드라는 것을 설명해주는 어노테이션. @override를 상위클래스에 정의되지 않은
메소드에 쓰는 경우 컴파일 에러가 나기 때분에 혹시나 발생할 수 있는 에러소지를 예방해주는 역할을 함.

 

 

 

 

 

0. @Required

- setter 메서드에 적용해주면 빈 생성시 필수 프로퍼티 임을 알린다.

 

 

 

 

 

11. @Getter, @Setter

@Getter - 클래스 내 모든 필드의 Getter 메서드를 자동으로 생성

 

@Setter - Controller에서 @RequestBody로 외부에서 데이터를 받는 경우엔 기본생성자 + set메서드를 통해서만 값이 할당된다. 그래서 이떄만 setter를 허용 한다.

 

 

 

 

 

0. @RequestBody

- 요청이 온 데이터(JSON이나 XML형식)를 바로 클래스나 model로 매핑하기 위한 애노테이션



 

 

 

0. @RequestHeader

- Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용

@RequestHeader(value="Accept-Language")String acceptLanguage 로 사용 //ko-KR,ko;q=0.8,en-US;q=0.6



 

 

 

0. @RequestParam

- @PathVariable과 비슷하다. request의 parameter에서 가져오는 것이다. 메소드의 파라미터에 사용됨

 

 

 

 

 

0. @PathVariable

- 메서드 파라미터 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.

 

 

 

 

 

 

0. @RequestPart

- Request로 온 MultipartFile을 바인딩해준다.

@RequestPart("file")MultipartFile file로 받아올 수 있음.

 

 

 

 

 

12. @ToString

@ToString(exclude="field")

특정 필드를 제외한 toString() 메서드를 만듬

 

 

 

 

13. @Builder

어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워 준다.

* 참고: 생성자와 빌더의 차이

- 둘다 생성 시점에 값을 채워주는 역할을 하지만, 빌더 패턴을 사용하면 어느 필드에 어떤 값을 채워야 할지가 명확하게 인지된다.

- 해당 클래스의 빌더 패턴 클래스를 생성

 

 

 

 

 

14. @Before

어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행

 

 

 

 

 

15. @NoArgsConstructor, @AllArgsConstructor, @RequriedArgsConstructor

 

 

 

16. @Log4j2

- 클래스마다 일일이 로거를 생성해주는 여간 귀찮은 일이 아닙니다. 이 때, @Log 어노테이션을 사용하면 자동으로 log 필드를 만들고, 해당 클래스의 이름으로 로거 객체를 생성하여 할당해줍니다. @Log 뿐만 아니라, @Slf4j @Log4j2 등 다양한 로깅 프레임워크에 대응하는 어노테이션을 제공하오니 참고바랍니다.

 

 

 

- 로깅 프레임워크 제공

 

- 해당 어노테이션을 클래스에 선언하게 되면 다음과 같은 변수가 내부적으로 생성되며

 

- 실제 선언되어 있지 않아도 log변수의 메소드에 접근할 수 있다.
Private static final org.apache.logging.log4j.Logger log;

log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);

 

 

 

 

 

0. @ConfigurationProperties

yaml파일을 읽는다. 

Default로 스프링부트 설정파일인 classpath:application.properties파일이 조회된다.

속성 클래스를 따로 만들어두고 그 위에 (prefix="xx") 써서 접두사를 사용할 수도 있음 

ex) xx.host=192.348~

xx.host = mailserver@mail.com

xx.port = 9000

xx.defaultRecipients[0] = admin@mail.com

xx.defaultRecipients[1] = customer@mail.com

 

 

 

 

 

0. @Lazy

- 지연로딩을 지원한다.

@Component나 @Bean 애노티에션과 같이 쓰는데 클래스가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.



 

 

 


 

 

 

 

0. @Transactional

- 데이터베이스 트랜잭션을 해당 메서드에 적용.
= DB에 엑세스하는 여러 연산을 하나의 트랜잭션으로 처리하여 오류가 발생한 경우 롤백을 도와주는 것

 

- 데이터베이스 트랜잭션을 설정하고 싶은 메서드에 애노테이션을 적용하면 메서드 내부에서 일어나는 데이터베이스 로직이 전부 성공하게되거나 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 애노테이션

 

- @Transaction(readOnly=true, rollbackFor=Exception.class)

readOnly는 읽기전용임을 알리고 rollbackFor는 해당 Exception이 생기면 롤백하라는 뜻

 

- @Transaction(noRollbackFor=Exception.class)

해당 Exception이 나타나도 롤백하지 말라는 뜻

 

- @Transaction(timeout = 10)

10초안에 해당 로직을 수행하지 못하면 롤백하라는 뜻.

 

 

 

 

 

 

 

17. @EnableTransactionManagement

Java Config를 위한 어노테이션 중 하나.
어노테이션 기반으로 트랜잭션을 활성화함.

 

 

 

18. @WebFilter

filter를 등록하고 설정하는 어노테이션.   태그를 통해 사용하던 설정 모두를 지원.

 

 

 

 

19. @ControllerAdvice

- 전역 예외 핸들러로 사용되며 @ExceptionHandler와 같이 사용됨

 

- 클래스 위에 ControllerAdvice를 붙이고, 어떤 예외를 잡아낼 것인지는 각 메소드 상단에 @ExceptionHandler(에외클래스명.class)를 붙여서 기술한다.

 

 

 

 

 

 

20. @ExceptionHandler

● @ControllerAdvice와 함께 사용되며 처리하고자 하는 예외클래스를 적용

 

● @ExceptionHandler(ExceptionClassName.class)

- 해당 클래스의 예외를 캐치하여 처리한다.

 

 

 

 

 

0. @RestControllerAdvice

- @ControllerAdvice의 기능에 body값을 전달할 수 있게 해주는 어노테이션

 

- 문법적 설탕으로 @ControllerAdvice + @ResponseBody다.

 

 

 

 

21. @Qualifier

기본적으로 @Autowired와 같이 의존성 주입을 위해 사용하나 동일한 타입을 가진 Bean객체가 두개 이상인 경우 사용

 

 

 

 

22. @ResponseStatus

- 요청 클라이언트에게 전달할 응답상태코드값을 지정하며 기본값은 200 ok 응답코드가 반환된다.

 

- 사용자에게 원하는 response code와 reason을 리턴해주는 애노테이션

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "my page URL changed..") => 예외처리 함수 앞에 사용한다.

 

 

 

 

 

 


 

 

 

 

 

0. @Cleanup 

자동 자원 닫기

IO 처리나 JDBC 코딩을 할 때, try-catch-finally 문의 finally 절을 통해서 close() 메소드를 호출하는 게 여간 번거로운 일이 아니었는데요. @Cleanup 어노테션을 사용하면 해당 자원이 자동으로 닫히는 것이 보장됩니다.

 

 

 

 

 

0. @SneakyThrows

예외 처리 생략

Checked Exception 때문에 반드시 throws try-catch 구문을 통해서 번거롭게 명시적으로 예외 처리를 해줘야할 때 가 있습니다. 이럴 때, @SneakyThrows 어노테이션을 사용하면 명시적인 예외 처리를 생략할 수 있습니다. (호불호가 갈릴 수 있는 기능인 것 같습니다.)

 

 

 

 

 

 

 

0. @CrossOrigin

- CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX요청을 방지하는 것이다.

@RequestMapping이 있는 곳에 사용하면 해당 요청은 타 도메인에서 온 ajax요청을 처리해준다.

@CrossOrigin(origins = "http://jeong-pro.tistory.com", maxAge = 3600)

-> 기본 도메인이 http://jeong-pro.tistory.com 인 곳에서 온 ajax요청만 받아주겠다.

 

 

 

 

 

0. @EnableEurekaServer

- Eureka 서버로 만들어준다.

 

 

 

 

0. @EnableDiscoveryClient

- Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려주기위한 애노테이션

 

 

 

 

 

 

 

 

 

 

"JPA" 어노테이션 종류 ★ ★

1. @Entity

이 어노테이션은 해당 클래스가 엔티티임을 알리기 위해 사용합니다.

 

애플리케이션이 실행이 될 때 엔티티 자동검색을 통하여 이 어노테이션이 선언 된 클래스들은 엔티티 빈으로 등록합니다.

 

(참고)

엔티티 빈이란?

데이터를 객체화하여 재사용이 가능한 컴포넌트를 말한다.

 

 

 

 

 

2. @Table

데이터의 저장소, 테이블을 의미합니다.

 

name 값은 실제 데이터베이스의 테이블명을 의미하며, 이 어노테이션은 생략이 가능합니다.

 

어노테이션을 생략하면 클래스의 이름을 테이블의 이름으로 자동 인식하게 됩니다.

 

 

 

 

 

3. @Id

엔티티빈의 기본키를 의미합니다.

 

이 어노테이션은 하나의 엔티티에는 반드시 하나가 존재해야 합니다. 복수키도 설정할 수 있습니다만, 해당 내용은 후에 다루도록 하겠습니다.

 

 

 

 

 

4. @GeneratedValue

데이터베이스에 의해 자동으로 생성된 값이라는 의미입니다.

 

즉, 프로그램 상에서 조작된 데이터가 아닌, 실제 데이터베이스에 데이터가 영속(저장)될 때 생성되는 값입니다. 몇가지 생성전략이 존재합니다. 역시 해당 내용은 후에 다루도록 하겠습니다.

 

 

 

 

 

 

5. @Column

필드와 테이블의 컬럼을 매핑시켜줍니다.

 

이 어노테이션은 생략이 가능하며, 생략시 필드의 이름이 테이블의 컬럼으로 자동으로 매핑이됩니다.

 

 

 

 

 

6. @Temporal - 날짜

@Temporal(TemporalType.TIMESTAMP) 

protected Date regdate;

 

TemporalType.Date : 년-월-일 의 date 타입

 

TemporalType.Time : 시:분:초 의  time 타입

 

TemporalType.TIMESTAMP : date + time 의 timestamp(datetime) 타입

 

애노테이션을 사용하지 않을 경우 기본값은 timestamp 입니다.

 

JPA 데이터베이스 방언에 의해, 데이터베이스의 타입에 따른 timestamp 또는 datetime은 자동으로 작성됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"Lombok" 어노테이션 종류 ★ ★

 

 

https://www.daleseo.com/lombok-popular-annotations/

 

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

Engineering Blog by Dale Seo

www.daleseo.com

 

 

 

1. 생성자 자동 생성

@NoArgsConstructor  어노테이션 
->  파라미터가 없는 기본 생성자를 생성해주고

 

@AllArgsConstructor 어노테이션 
-> 모든 필드 값을 파라미터로 받는 생성자를 만들어줍니다. 

 

@RequiredArgsConstructor 어노테이션 
->  final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어줍니다.

 

 

(예시)

 

 

 

 

2. ToString 메소드 자동 생성

- Lombok을 사용하면 @ToString 어노테이션만 클래스에 붙여주면 자동으로 생성해줍니다.

 

 

 

- 예제와 같이 exclude 속성을 사용하면, 특정 필드를 toString() 결과에서 제외시킬 수도 있습니다.

 

 

- 위와 같이 클래스에 @ToString 어노테이션을 붙이고, 아래와 같이 필드를 세팅 후 출력을 하면,

 

 

- 다음과 같이, 클래스명(필드1명=필드1값,필드2명=필드2값,...) 식으로 출력됩니다.

 

 

 

 

 

3. equals, hashCode 자동 생성

자바 빈을 만들 때 equals hashCode 메소드를 자주 오버라이딩 하는데요. @EqualsAndHashCode 어노테이션을 사용하면 자동으로 이 메소드를 생성할 수 있습니다.

 

callSuper 속성을 통해 equals와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있습니다.

 

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

 

 

 

 

 

4. @Data

@Data

위에서 설명드린 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 한꺼번에 설정해주는 매우 유용한 어노테이션입니다.

 

 

 

 

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