[Spring] Annotation

Bam·2024년 4월 20일
0

Spring

목록 보기
9/48
post-thumbnail

스프링과 어노테이션

스프링을 사용해서 프로그래밍할 때 어노테이션이 정말 많이 사용됩니다. 이런 어노테이션들은 클래스나 메소드 앞에 사용되어 해당 클래스, 메소드에 특별한 기능이나 의미를 더하게 됩니다.

Annotation은 사전적으로는 주석을 의미하지만, 자바에서는 코드의 메타 데이터 역할을 수행합니다. 기본적인 내용은 자바 어노테이션 포스트를 참조해주세요.

스프링에서 사용되는 어노테이션들은 엄청 많은 종류들이 존재합니다. 그렇기 때문에 우선적으로는 자주 등장하는 어노테이션들부터 정리하고 차차 추가해나가볼까 합니다.


스프링 어노테이션

@Autowired

@Autowired는 의존성 주입에 사용됩니다. 의존성 주입은 3가지 방식을 사용합니다.

  • 필드 주입: 필드에 @Autowired 어노테이션을 붙인다.
  • setter 주입: setter에 @Autowired 어노테이션을 붙인다.
  • 생성자 주입: 가장 많이 사용되는 의존성 주입 방법으로, 생성자에 @Autowired 어노테이션을 붙인다.

@Component

@Component는 컴포넌트 스캔을 통해 자동으로 빈으로 등록되고자 하는 클래스를 나타냅니다. 스프링은 @Component가 붙은 클래스를 자동으로 빈에 등록합니다.

@ComponentScan

@ComponentScan@Component, @Controller, @Configuration, @Repository, @Service로 등록된 클래스를 찾아 빈으로 등록합니다. 이때 @ComponentScan이 사용된 위치의 패키지와 그 하위 패키지들의 클래스들을 찾습니다.

@Bean

@Bean은 빈을 등록합니다.

@Configuration

@Configuration@Bean 어노테이션이 붙은 메소드들을 빈으로 정의(등록)합니다.

@Controller

@Controller는 스프링에게 클래스가 Controller(요청, 응답 처리)임을 알립니다.

@Service

@Service는 스프링에게 비즈니스 로직(서비스)를 처리하는 클래스임을 알립니다.

@Repository

@Repository는 스프링에게 DB 로직(외부 IO)을 처리하는 클래스임을 알립니다.

@RequestMapping

@RequestMapping은 요청에 대해 URL을 매핑합니다.

파라미터에 따라서 동작이 조금씩 달라지는데 각 동작은 예제 코드를 통해 설명합니다.

@Controller
@RequestMapping
class MemberController1 {
	//모든 요청을 받아들임
    //class 레벨에 @RequestMapping을 사용하면 하위 메소드들에 모두 적용이됩니다.
}

@Controller
@RequestMapping("/newmember")
class MemberController2 {
	@RequestMapping(method = RequestMethod.POST)
	public void addMember() {
    	// /newmember로 들어오는 요청에 대해서만 처리
        // POST method 요청에 대해서만 처리
        //즉, 이 메소드는 POST로 들어온 /newmember 요청만을 처리합니다.
    }
}

@Controller
@RequestMapping("/newmember")
class MemberController3 {
	@RequestMapping("/post")
	public void addMember() {
    	//이 메소드의 실제 URL은 /newmember/post
    }
}

MemberController2에서 @RequestMapping(method = RequestMethod.POST)로 요청 메소드를 표현했는데요. 이 경우에는 위와같이 표현하는 것보다 각 요청 메소드에 대응되는 @GetMapping, @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping를 사용하는 것이 권장됩니다.

@RequestParam

@RequestParam은 URL의 파라미러를 메소드의 파마리터와 매칭시켜서 파라미터를 처리할 수 있께 해줍니다.

@Controller
class MemberController {
	@GetMapping("/member")
    public String getMember(@RequestParam String name) {
    	//https://xxx.com?name=apple라는 URL GET 요청이 들어오면,
    	String membername = name;	//membername = apple
    }
}

@RequestHeader

@RequestHeader 요청의 헤더를 가져옵니다. 가져온 헤더는 @RequestHeader가 사용된 메소드의 파라미터로 사용될 수 있습니다.

@RequestBody

@RequestBody는 Body에 대한 요청을 처리합니다. 주로 JSON을 객체로 만들어주는 작업을 하게 됩니다.

스프링에 Jackson이라는 JSON 데이터 처리 라이브러리가 내장되어있기 때문에 JSON 요청을 기본적으로 받습니다. 필요하다면 다른 데이터 타입을 받을 수 있는 라이브러리를 설치해서 이용하면 다른 데이터 타입을 받아들일 수도 있습니다.

@Controller
class MemberController {
	@GetMapping("/member")
    public String getMember(@RequestBody Member member) {
    	//https://xxx.com?name=apple라는 URL GET 요청이 들어오면,
    	String membername = member.name;	//membername = apple
    }
}

@ModelAttribute

@ModelAttribute는 폼(form) 형태의 Body, 파라미터를 setter를 통해 객체에 1:1 바인딩합니다. JSON 데이터를 요구했던 @RequestBody과는 다르게 multipart/form-data 형식을 받습니다.

multipart/form-data가 무엇인지는 이 포스트를 참조해주세요.

@RequestPart

@RequestPart는 요청 Body에 multipart/form-data를 받을 때 사용합니다.

@ModelAttribute@RequestPart의 비교는 이 포스트를 참조해주세요.

@PathVariable

@PathVariable은 URL에서 변수를 사용할 수 있게 해줍니다. 중괄호 {}로 감싼 부분을 변수로 사용할 수 있게 해줍니다.

@GetMapping("/members/{name}")
public void getMember(@PathVariable String name) { }

@ResponseBody

@ResponseBody는 응답 Body에 JSON 또는 xml의 형태로 데이터를 담아 요청에 대해 응답합니다.

@ResponseStatus

@ResponseStatus는 HTTP 응답 코드를 반환할 수 있게 해줍니다. 주로 응답 코드를 반환해야하는 예외 처리 상황에서 사용합니다.

0개의 댓글