Spring Annotaion 알아보기

2024. 10. 23. 18:14·BackEnd/Spring
Annotation 이란? 

 

Spring Framework에서 사용되는 메타데이터를 제공하는 방식으로, 사전적 의미로는 주석이라는 뜻이다.

자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 클래스, 메서드, 필드 등에 다양한 기능을 부여할 수 있다.

이를 통해 XML 설정 파일을 줄이고 코드의 가독성과 관리성을 높일 수 있다.

 

Annotation의 용도

 

어노테이션을 사용하면 코드가 깔끔해지고 재사용이 가능하다.

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
  • 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
  • 실행시 (런타임시) 특정 기능을 실행하도록 정보를 제공한다.

 

Annotation 사용 순서

 

  1. 어노테이션 정의
  2. 클래스에 어노테이션 배치
  3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시

 

Annotation 종류

 

 

@Scope


Scope 어노테이션은 빈(Bean)의 스코프를 지정하는 데 사용된다. 스코프는 빈이 생성되고 관리되는 방식, 그리고 그 빈이 사용하는 범위를 결정한다. 기본적으로 Spring은 빈을 싱글톤(Singleton) 스코프로 관리하지만, @Scope를 통해 다른 스코프를 설정할 수 있다.

 

주요 스코프 종류

Scope   Description
Singleton
(default)
@Scope("singleton") 애플리케이션 전체에서 하나의 빈 인스턴스를 생성하여 공유한다.
스프링 컨테이너가 시작될 때 빈을 생성하고, 해당 빈을 모든 요청에서 동일하게 사용한다.
Prototype @Scope("prototype") 빈 요청 시마다 새로운 인스턴스를 생성한다.
각 요청마다 다른 객체가 반환되므로, 상태를 가진 객체를 생성할 때 사용한다.
Request @Scope("request") 웹 애플리케이션에서 사용
각 HTTP 요청마다 하나의 빈 인스턴스가 생성된다.
요청이 끝나면 해당 빈은 더 이상 사용되지 않는다.
Session @Scope("session") 웹 애플리케이션에서 사용
각 HTTP 세션마다 하나의 빈 인스턴스가 생성된다.
세션이 유지되는 동안 동일한 빈을 사용할 수 있다.

 

 

 

@Autowired

  • 속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입해준다.
  • 무조건적인 객체에 대한 의존성을 주입시킨다.
  • 이 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당한다.
  • Controller 클래스에서 DAO나 Service에 관한 객체들을 주입시킬 때 많이 사용한다.

 

 

@Resource

  • @Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점은 Autowired는 Type으로, Resource는 이름으로 연결해준다.
  • Annotation 사용으로 인해 특정 Framework에 종속적인 어플리케이션을 구성하지 않기 위해서는 @Resource를 사용할 것을 권장한다.
  • 필드, 입력 파라미터가 한 개인 bean property setter method에 적용 가능하다.

 

 

@Component

  • 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation이다.
  • Component에 대한 추가 정보가 없다면 이름을 camelCase로 변경한 것이 Bean id로 사용된다.
  • 하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.

 

 

@ComponentScan

  • @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean을 등록 해주는 Annotation이다.
  • @SpringBootApplication에는 @ComponentScan이 포함되어있다.
@ComponentScan
public class AutoDependencyConfig {

}

@ComponentScan(basePackages = "pack.model") //pack.model 패키지부터 스캔
public class AutoDependencyConfig {

}
ApplicationContext.xml에 <bean id="jeongpro" class="jeongpro" /> 과 같이 xml에 bean을 직접등록하는 방법도 있고 위와 같이 Annotation을 붙여서 하는 방법도 있다.
base-package를 넣으면 해당 패키지 아래에 있는 컴포넌트들을 찾고 그 과정을 spring-context-버전(4.3.11.RELEASE).jar에서 처리한다.
Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는, 예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.
또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.
자동으로 등록되는 Bean의 이름은 클래스의 첫문자가 소문자로 바뀐 이름이 자동적용된다.HomeController -> homeController

 

 

 

@Bean

  • 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려할 때 사용되는 Annotation이다.
  • ArrayList 같은 라이브러리 등을 Bean으로 등록하기 위해서는 별도로 해당 라이브러리 객체를 반환하는 Method를 만들과 @Bean Annotation을 사용하면 된다.

 

 

@Service

  • 해당 클래스가 Service Bean 임을 지정한다.
  • @Component Annotation을 사용해도 상관 없지만 @Component의 기능이 포함되어 있고, 해당 클래스가 비즈니스 로직을 담은 Service의 역할을 하는 것을 명확하게 알 수 있다.

 

 

@Repository

  • 해당 클래스가 Repository Bean 임을 지정한다.
  • @Component Annotation을 사용해도 상관 없지만 @Component의 기능이 포함되어 있고, 해당 클래스가 DB 관련 역할을 하는 것을 명확하게 알 수 있다. 

 

 

@Controller

  • 해당 클래스가 Controller Bean 임을 지정한다.
  • @Component Annotation을 사용해도 상관 없지만 @Component 의 기능이 포함되어 있고,  해당 클래스가 Controller 역할을 하는 것을 명확하게 알 수 있다.

 

 

@MVC

  • Annotation을 중심으로 한 새로운 MVC의 확장 기능은 @MVC라는 별칭으로도 불린다.

 

 

@RequestMapping

  • 요청 URL을 어떤 method가 처리할지 mapping 해주는 Annotaion이다.
  • Controller나 Controller의 method에 적용한다.
  • 요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다. (default 는 GET)
  • 실제 요청 URL은 class의 @RequestMapping 값과 method의 @RequestMapping 값의 조합으로 지정한다.
예) @RequestMapping(value="/product/form", method="RequestMethod.GET")

 

 

 

@PathVariable

  • URL에 { } 로 들어가는 패스 변수를 받는다.
  • URL의 특정 위치에 파라미터 값을 넣게 하면, 이해하기 쉬운 URL을 만들 수 있다. (RESTFull)
예 ) @RequestMapping(value="/article/view/{articleld}", method= RequestMethod.DELETE)
        @ResponseBody
         public ModelAndView view(@PathVariable(value="articleld")int articleld){ ....

 

 

 

@RequestParam

  • 단일 HTTP 요청 파라미터의 값을 메소드 파라미터에 넣어주는 Annotation이다.
  • 해당 파라미터가 반드시 있어야한다. 없다면 HTTP 400 - Bad Request를 받게 된다.
  • 파라미터를 필수가 아니라 선택적으로 제공하게 하려면, required 엘리먼트를 false로 설정한다.
예 1) public String view(@RequestParam("id")int id){ ... }
예 2) public String view(@RequestParam(value="id", required=false, defalutValue="-1"){ ... }

 

  • @RequestParam에 파라미터 이름을 지정하지 않고 Map<String, String> 타입으로 선언하면 모든 요청 파라미터를 맵으로 받을 수 있다.
예) public String add(@RequestParam<String, String> params){ ... }

 

 

 

@ModelAttribute

  • 요청 파라미터를 Object(모델 객체) 형태로 Controller에서 전달 받을 수 있다.
  • HTTP 요청으로부터 전달된 폼 데이터나 쿼리 파라미터를 자동으로 객체에 바인딩한다.
  • 특정 메서드에서 반환된 객체를 뷰에 전달하여 사용할 수 있도록 해준다.
--요청 파라미터 바인딩
@PostMapping("/submit")
public String handleSubmit(@ModelAttribute("formData")FormData formData){
	//formData 객체에 폼데이터가 바인딩됨
    return "result";
}

--뷰로 전달
@ModelAttribute("commonData")
public String populateCommonData() {
    return "공통 데이터";
}

 

 

 

@RequestBody

  • HTTP의 Body를 그대로 웹서버로 전달한다.
  • 요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation이다.
  • POST나 PUT, PATCH로 요청을 받을 때에, 요청에서 넘어온 body값들을 자바 타입으로 파싱해준다.
  • HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑한다.
public void message(@RequestBody String body){ ... }

 

 

 

@ResponseBody

  • HTTP의 Body를 그대로 클라이언트로 전달한다.
  • HttpMessageConverter를 이용하여 JSON 혹은 XML로 요청에 응답할 수 있게  해주는 Annotation이다.
  • view가 아닌 JSON 형식의 값을 응답할 때 사용하는 Annotation으로 문자열을 리턴하면 그 값을 http response header가 아닌 reponse body에 들어간다.
@RequestBody
public void message(){ ... }

 

 

 

@Valid

  • 요청된 파라미터를 모델 클래스에 셋팅하면서 해당 값에 대한 유효성 체크를 함께 할 수 있다.

 

 

@Configuration

  • 한 개 이상의 @Bean 을 제공하는 클래스에 명시하는 어노테이션으로, IOC Container에게 해당 클래스가 Bean으로 구성된 클래스라는 것을 알려준다.
  • @Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.

 

 

@Value

  • properies에서 값을 가져와 적용할 때 사용한다.
@Value("${value.from.file}")

 

@Value는 왜 사용하는가?
DB 연결에 필요한 정보(계정 정보)나 노출되기 민감한 값들을 하드 코딩하게 된다면, 여러 가지 이슈에 휘말릴 수 있다. (깃허브 같은 공유 레퍼지토리에 그대로 코드와 함께 유출될 것이다.) 또한 개발 시엔 로컬에 맞는 환경으로 세팅을 했지만, 클라우드 서버에 올린다거나 배포 환경으로 전환될 때, 직접 해당 코드를 수정해야 하는 번거로움이 있다. 이런 문제들을 막기 위해 민감한 정보나, 메타정보들은 파일로 따로 빼두어 관리하게 된다. (수정과 관리가 용이하기 때문)
이러한 이유로 따로 빼둔 설정 파일을 필요한 곳에 주입시켜주는 어노테이션이 @Value다.

 

저작자표시 비영리 변경금지 (새창열림)

'BackEnd > Spring' 카테고리의 다른 글

Entity 와 DTO의 개념과 차이점  (9) 2024.11.03
[Thymeleaf] 3. 사용 예시 (기본, 레이아웃)  (7) 2024.11.01
[Thymeleaf] 2. Thymeleaf 문법  (4) 2024.10.30
[Thymeleaf] 1. Thymeleaf 의 특징과 설정 방법  (5) 2024.10.29
Ant, Maven, Gradle 의 차이  (5) 2024.10.20
'BackEnd/Spring' 카테고리의 다른 글
  • [Thymeleaf] 3. 사용 예시 (기본, 레이아웃)
  • [Thymeleaf] 2. Thymeleaf 문법
  • [Thymeleaf] 1. Thymeleaf 의 특징과 설정 방법
  • Ant, Maven, Gradle 의 차이
hee-coding
hee-coding
  • hee-coding
    J의 코딩 일기
    hee-coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • FrontEnd (3)
        • HTML,CSS,Java Script (0)
        • React (3)
      • BackEnd (11)
        • DataBase (0)
        • JAVA (4)
        • Servlet & JSP (0)
        • Spring (7)
      • Project (1)
      • Error (1)
      • Git (0)
      • Coding Test Practice (4)
      • 일상~ (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Coding
    frontend
    react
    it
    오블완
    코딩
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
hee-coding
Spring Annotaion 알아보기
상단으로

티스토리툴바