어노테이션(Annotation)
- 어노테이션(Annotation)은 자바 프로그래밍 언어에서 코드에 메타데이터를 추가하는 방법을 제공하는 메커니즘아다.
- 어노테이션은 코드에 주석을 달거나 코드를 컴파일할 때, 런타임 시에 어떤 동작을 지정하는 데 사용된다.
- 스프링 프레임워크와 같은 많은 자바 기반 프레임워크에서 어노테이션을 활용하여 설정 및 동작을 정의한다.
스프링 부트 프레임워크에서의 어노테이션
@SpringBootApplication
@SpringBootApplication 애노테이션은 스프링 부트 애플리케이션의 주 진입점을 나타낸다.
이 애노테이션은 다음 세 가지 애노테이션을 포함하고 있다.
- @Configuration : 현재 클래스를 스프링의 설정 파일로 사용함을 나타낸다.
- @EnableAutoConfiguration : 스프링 부트의 자동 설정 기능을 활성화한다.
- @ComponentScan : 현재 패키지와 하위 패키지의 컴포넌트를 스캔하여 스프링 빈으로 등록한다.
이 애노테이션을 사용하면 스프링 부트 애플리케이션을 실행하기 위한 설정이 자동으로 이루어진다.
이 애노테이션에는 scanBasePackages라는 속성이 있으며, 이를 통해 컴포넌트 스캔을 어떤 패키지부터 시작할지 지정할 수 있다.
ex) @SpringBootApplication(scanBasePackages = "com.kh")@Controller
@Controller 애노테이션은 스프링 MVC에서 컨트롤러(Controller) 역할을 하는 클래스에 지정된다.
HTTP 요청을 처리하고, 응답을 생성하는 컨트롤러 클래스에 사용된다.
주로 사용자의 요청을 받아 처리하고, 그에 맞는 데이터를 view에 전달하여 클라이언트에게 응답한다.@Service
@Service 애노테이션은 비즈니스 로직을 담당하는 서비스(Service) 클래스에 지정된다.
서비스 클래스는 트랜잭션 처리나 복잡한 비즈니스 로직을 포함하며, 주로 @Controller에서 호출되어 사용된다.
서비스 계층은 일반적으로 DAO(Data Access Object) 계층에게 데이터 액세스를 위임하고, 그 결과를 가공하여 반환한다.@Repository
@Repository 애노테이션은 데이터 액세스 계층의 DAO 클래스에 지정된다.
주로 데이터베이스나 다른 영구 저장소에서 데이터를 읽고 쓰는 역할을 한다.
@Repository는 데이터베이스 예외를 스프링의 DataAccessException으로 변환해주는 기능도 제공한다.@GetMapping
@GetMapping 애노테이션은 HTTP GET 요청을 처리하는 메서드에 붙인다.
@PostMapping
@PostMapping 애노테이션은 HTTP POST 요청을 처리하는 메서드에 붙인다.
@Autowired
@Autowired 애노테이션은 필드, 생성자, 메서드에 사용할 수 있다.
주로 스프링 빈 간의 의존성을 자동으로 주입할 때 사용된다.
@Autowired를 필드에 적용할 경우, 스프링은 해당 필드의 타입에 맞는 빈을 찾아 자동으로 주입한다.@MapperScan
@MapperScan은 MyBatis와 같은 ORM 프레임워크에서 사용되어 Mapper 인터페이스를 스캔하여 자동으로 등록한다.
@Mapper
Mapper는 MyBatis 프레임워크에서 사용되는 애노테이션으로, 인터페이스를 Mapper로 지정한다.
기본적으로 @Mapper 애노테이션은 스프링에서 인식하지 않으며, MyBatis의 구성에 따라 필요한 설정이 있다.@Data
@Data는 Lombok 프로젝트에서 제공하는 애노테이션으로, 자바 클래스에서 보통 반복적으로 작성해야 하는 메서드들을 자동으로 생성해주는 기능을 제공한다.
ex)getter, setter, constructor, toString..@RequestMapping("board")
클래스 레벨에서 @RequestMapping을 사용하면 해당 컨트롤러의 모든 핸들러 메서드에 대해 기본적인 요청 매핑을 설정한다.
ex) @RequestMapping("/board") : /board로 시작하는 모든 요청이 이 컨트롤러에 매핑됩니다.@ResponseBody
@ResponseBody는 메서드가 반환하는 객체를 HTTP 응답 본문으로 직접 전송하도록 지정하는 애노테이션이다.
스프링 MVC에서는 기본적으로 메서드가 반환하는 값이 View 이름으로 해석된다.
@ResponseBody를 사용하면 이러한 기본 동작을 무시하고, 객체를 직접 HTTP 응답 본문으로 변환하여 클라이언트에게 전송한다.@RestController
@RestController는 @Controller와 @ResponseBody를 합친 기능을 제공하는 애노테이션이다.
@Component
@Component는 스프링 컨테이너에게 해당 클래스가 컴포넌트임을 나타내는 애노테이션이다.
스프링은 @ComponentScan으로 지정된 패키지를 스캔하여 이 애노테이션이 붙은 클래스를 찾고, 해당 클래스의 인스턴스(빈)를 스프링 애플리케이션 컨텍스트에 등록한다.
주로 개발자가 작성한 클래스를 스프링 빈으로 등록할 때 사용된다.
@Controller, @Service, @Repository 애노테이션들은 모두 @Component 애노테이션을 확장(상속)한다.@Configuration
@Configuration 애노테이션은 스프링에서 설정 클래스를 정의할 때 사용된다.
이 애노테이션을 사용하면 해당 클래스가 스프링 IoC 컨테이너에게 빈을 구성하는 역할을 한다는 것을 나타낸다.
주로 빈 정의, 빈 간 의존성 설정, 외부 설정 파일의 로딩 등의 작업을 수행한다.ex)
@Configuration public class KhConFig(){ }@Bean
@Bean 애노테이션은 메서드에 붙여서 해당 메서드가 스프링 컨테이너에 의해 관리되는 빈 객체를 생성한다는 것을 나타낸다.
메서드의 이름이 해당 빈의 이름이 되고, 메서드의 반환 값이 빈 객체가 된다.
@Bean 애노테이션이 붙은 메서드는 객체의 생성 및 초기화를 담당하며, 필요한 경우 빈 간의 의존성 주입도 처리할 수 있다.ex)
@Configuration public class KhConFig(){ @Bean public voic me01() { return ne Hello(); } }@transactional
@Transactional 애노테이션은 스프링 프레임워크에서 트랜잭션 관리를 지원하기 위해 사용된다. 주로 서비스 레이어의 메서드에 적용되며, 트랜잭션의 범위와 롤백 조건을 설정할 수 있다.
*spring에서는 커밋이 자동으로 된다.
ex)
@Service @Transactional public class BoardService { @Autowired private BoardDao dao; public void write() { int result = dao.write(); if(result != 1){ new throw IllegalArgumentException(); }// 예외가 발생하면 롤백됨 return result; } }@NoArgsConstructor
클래스에 @NoArgsConstructor 애노테이션을 붙이면 매개변수가 없는 기본 생성자를 자동으로 생성한다.
@AllArgsConstructor
클래스에 @AllArgsConstructor 애노테이션을 붙이면 모든 필드를 매개변수로 받는 생성자를 자동으로 생성한다.
@RequiredArgsConstructor
final 이나 @NonNull으로 지정된 필드만을 매개변수로 받는 생성자를 자동으로 생성한다.
Final 필드 초기화 : final 키워드로 선언된 필드는 반드시 객체 생성 시 초기화되어야 힌다. @RequiredArgsConstructor를 사용하면 이를 강제화할 수 있어 객체의 일관성과 안정성을 높인다.ex)
@RequiredArgsConstructor public class BoardController { private final BoardService service; }@Param
@Param 어노테이션은 MyBatis에서 SQL 매퍼 XML 파일이나 메소드 파라미터에 전달되는 파라미터 이름을 지정하는 데 사용된다.
ex)
@Select({ "<script>" ,"SELECT *" ,"FROM BOARD" , "<if test='m.stype != null'>" ,"WHERE ${m.stype}" ,"LIKE '%${m.svalue}%' " , "</if>" ,"</script>" }) List<BoardVo> searchBaordList(@Param("m") Map<String, String> paraMap);@CrossOrigin
@CrossOrigin은 스프링 프레임워크에서 제공하는 애노테이션으로, CORS(Cross-Origin Resource Sharing) 정책을 적용하도록 컨트롤러나 특정 핸들러 메서드에 설정할 수 있다.
*CORS(Cross-Origin Resource Sharing) 정책은 웹 애플리케이션의 보안 메커니즘 중 하나로, 브라우저에서 실행 중인 스크립트가 다른 출처(Origin)의 리소스에 접근하는 것을 제한하는 정책이다. 여기서 출처(Origin)란 프로토콜, 호스트, 포트 번호가 모두 동일한 URL을 말한다.