성장에 목마른 코린이

[Java] Spring Boot Annotation 정리 본문

Java/Spring Boot

[Java] Spring Boot Annotation 정리

성장하는 코린이 2022. 10. 21. 10:02
728x90

Annotation은 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 합니다.

Annotation을 활용해 Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며,

자동으로 getter나 setter를 생성하기도 합니다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있습니다.

Annotation을 이용하면 코드량이 감소하고, 유지보수하기 쉬우며, 생산성이 증가됩니다.

 

@Bean

Spring 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.

Bean Annotation은 개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용합니다.

즉, 개발자가 직접 작성한 Class에 @Bean 선언은 불가능합니다.

 

@Component

개발자가 직접 작성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다.

Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.

 

@ComponentScan

Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration

중 1개라도 등록된 클래스를 찾으면, Context에 Bean으로 등록합니다.

ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 동록해줍니다.

 

@Autowired

Spring Framework에서 Bean 객체를 주입받기 위해 Autowired Annotation을 사용합니다.

생성자에 @Autowired가 있으면 스프링이 연고나된 객체를 스프링 컨테이너에 찾아서 넣어줍니다.

이렇게 객체 의존관계를 외부에서 넣어주는 것을 '의존성 주입(DI)'라 합니다.

 

@Controller, Service, Repository 구조

@Controller

Component 어노테이션의 구체화된 형태입니다.

Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용하는 Annotation입니다.

MVC패턴 설명과 똑같이 Controller은 MVC에서 C에 해당하며

주로 사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 합니다.

사용자의 요청이 진입하는 지점이며 요청에 따라 어떤 처리를 할지 결정을 Service에 넘겨줍니다.

그리고 Service에서 실질적으로 처리한 내용을 다시 Controller가 받고 받은것을 Controller가 넘겨주는 역할을 합니다.

 

@Service

Component 어노테이션의 구체화된 형태입니다.

Spring에게 해당 Class가 Service의 역할을 한다고 명시하기 위해 사용하는 Annotation입니다.

서비스에는 사용자의 요구사항을 처리하는 로직이 있습니다.

DB의 데이터가 필요할 때는 Repository에게 요청을 합니다.

규모 프로젝트일 수록 Service의 내용이 비대해 질 것입니다.

 

@Repository

Component 어노테이션의 구체화된 형태입니다.

Spring에게 해당 Class가 Repository의 역할을 한다고 명시하기 위해 사용하는 Annotation입니다.

Entity에 의해 생성된 DB에 접근하는 메서드들을 사용하기 위한 인터페이스입니다.

쉽게 말해 DB 연결, 해제, 자원을 관리하고 CRUD 작업을 처리합니다.

 

@RequestHeader

Request의 header값을 가져올 수 있으며, 해당 Annotation을 쓴 메소드의 파라미터에 사용합니다.

 

@RequestMapping

RequestMapping Annotation은 클래스와 메서드 수준에서 모두 사용할 수 있습니다.

대부분의 경우 메소드 레벨에서 애플리케이션은 HTTP 메소드 특정 변형

@GetMapping, @PostMapping, @PutMapping, @DeleteMappping, @PatchMapping

중 하나를 사용하는 것을 선호합니다.

@RequestMapping(value = "/경로", method = RequestMethod.GET)와 

@GetMapping("/경로")는 동일하게 작동합니다.

 

@RequestParam

URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리할 수 있는 Annotation입니다.

Json 형식의 Body를 MesageConverter을 통해 Java 객체로 변환시킵니다.

 

@Transactional

트랜젝션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위입니다.

클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해줍니다.

트랜잭션 구성은 @Configuration, XML 기반, 애노테이션 기반으로 설정할 수있는데, 주로 애노테이션 기반으로 많이 사용됩니다.

애노테이션 방식은 선언적 트랜잭션이라고 불리고, 선언 시 트랜잭션 기능이 적용된 프록시 객체가 생성됩니다.

@Transactional으로 생성된 프록시 객체는 @Transactional이 적용된 메서드가 호출할 경우,

PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit/Rollback 동작을 수행합니다.

 

Transaction ACID (특징)

원자성(Atomicity)

- 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리

- 모두 성공하거나 모두 실패

일관성(Consistency)

- 트랜잭션은 일관성 있는 데이터베이스 상태를 유지

격리성(Isolation)

- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리

영속성(Durability)

- 트랜잭션을 성공적으로 마치면 결과가 항상 저장

 

Transaction Options

isolation

- 트랜잭션에서 일관성 없는 데이터 허용 수준을 설정 (격리 수준)

propagation

- 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 지정하는 옵션 (전파 옵션)

noRollbackFor

- 특정 예외 발생 시 rollback이 동작하지 않도록 설정

rollbackFor

- 특정 예외 발생 시 rollback이 동작하도록 설정

timeout

- 지정한 시간 내에 메소드 수행이 완료되지 않으면 rollback이 동작하도록 설정

readOnly

- 트랜잭션을 읽기 전용으로 설정

 

@Slf4j

Slf4j는 다양한 Logging Framework(java.util.loggin, logback, log4j)의 추상화를 제공합니다.

Slf4j는 Compile시 하나의 logging framework와 binding 해줍니다.

 

장점:

다양한 Logging Framework를 라이브러리만 추가해서 binding할 수 있습니다.

Log Library만 변경하면 로그 엔진을 바꿀수 있습니다.

 

출처: https://hello-bryan.tistory.com/331

Comments