스프링

Spring 어노테이션

짱코딩러 2022. 10. 17. 17:10
Lombok 관련 어노테이션 Spring 관련 어노테이션 테스트 관련 어노테이션
@Setter @Autowired @RunWith
@Data @Component @ContextConfiguration
@Log4j @AllArgsConstructor @Test

@Setter

속성 : value,onMethod,onParam

onMethod는 setter메서드 생성 시 메서드에 추가 할 어노테이션을 지정.

'_'표기는 버전마다 차이가 있다.

//onMethod로 setChef()에 @Autowired를 추가하도록 해줌.
@Setter(onMethod_ = @Autowired)
private Chef chef;

 

@Date

@ToString  @EqualsAndHashCode  @Getter/@Setter  @RequiredArgsConstructor 를 모두 결합한 형태

import lombok.Data;

@Data
public class SampleDTO {
	private String name;
	private int age;
}

 

@Log4j

로그 객체를 생성(기본탑재)

log.info("콘솔창에 뿌려줘요");

 

@Autowired

스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해 당 타입의 빈을 주입해달라는 표시.

스프링은 @Autowired를 보고 스프링 내부에 관리되는 객체(들) 중에 적당한 것이 있는지 확인 후 자동으로 주입해 준다.

(객체 없으면 에러뜸)

 

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 만들어줌


@NoArgsConstructor

파라미터가 없는 기본 생성자를 만들어줌

 

@Component

해당 클래스가 스프링에서 객체로 만들어 관리하는 대상임을 표시.(빈으로 관리해줌)

 

@ContextConfiguration

스프링이 실행되면서 어떤 정보를 읽어 들여야 하는 지 표시

//root-context.xml의 내용을 기반으로 객체(빈) 등록
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

 

@RunWith

테스트시 필요한 클래스를 지정

 

@Test

단위테스트의 대상임을 표시

 

 

 

예제

SampleHotel.java

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@Component
@ToString
@Getter
//@AllArgsConstructor	=>인스턴스 변수로 선언된 모든 것을 파라미터로 받은 생성자를 작성 해줌다.!
//@RequiredArgsConstructor	//final객체일떄 사용 가넝한.
public class SampleHotel {
	@NonNull	//final이 아닌경우에도 이거 붙여주면 댐니다.
	private Chef chef;
	
}

 

HotelTests.java

import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.sample.SampleHotel;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class HotelTests {
	//1.SampleHotel만 오토와이드 하고잇슴
	@Setter(onMethod_ = {@Autowired})
	private SampleHotel hotel;
	
	@Test
	public void testExist() {
		assertNotNull(hotel);
	    
	    //log객체로 내용을 뿌림.
	    log.info(hotel);
	    log.info("----------------------------------");
	    //2.근데 Chef()를 받고잇슴! SampleHotel.java에 생성자가 있어서/생성자의 역할을 해주는애가 있어서
	    log.info(hotel.getChef());
	}
}

 

 

 

 

Mapper 관련 어노테이션
@Select
@update, @delect, @insert
@ResultMap

@Select, @update, @delect, @insert

Mybaris 기능을 구현 할 필요 없이 어노테이션만으로 쿼리를 실행시킬 수 있는 기능(간단한 sql시 용이)

 

@ResultMap

@select의 사용을 확장시킬 수 있는 기능

 

Controller 관련 어노테이션
@Controller
@RequestMapping
@RequestParam
@InitBinder
@DateTimeFormat
@ModelAttribute
@RequestBody
@ResponseBody
@ControllerAdvice

@Controller

해당 클래스가 Controller라는 표시. 자동으로 스트링의 객체(Bean)로 등록됨.(클래스 아이콘에 s표시 추가)

 

@RequestMapping

클래스 선언시, 해당 클래스가 가진 모든 메서드들의 URL 경로 표시.

메서드 선언시, 클래스 경로+메서드 경로

@GetMapping과 @PostMapping 기능을 축약한 형태이므로, 배열로 지정해줄수도 있다.

@RequestMapping("/sample/*")
@RequestMapping(value="/basic",method={RequestMEthod.GET, RequestMethod.POST})//요청명, 전송타입

 

@RequestParam

파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우 사용

public 리턴타입 메소드명(@RequestParam("전달되는 이름") String 실제변수명, @RequestParam("a") int age)

 

@InitBinder

검증이 필요한 객체를 가져오기 전 수행할 메소드를 지정 (모든 요청 전에 InitBinder를 선언한 메소드가 실행된다.)

@InitBinder('객체명')으로 설정해주면 해당 객체에서만 적용된다. (기타 다양한 방법으로 필터링이 가능한.)

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
	}
//.jsp에서 확인 가넝한.

 

@DateTimeFormat

날짜 관련타입의 포맷을 지정.(@InitBinder 안써도댐)

@Data
public class TodoDTO {
	private String title;
	
	@DateTimeFormat(pattern = "yyyy/MM/dd")
	private Date dueDate;
}

 

@ModelAttribute

메소드의 매개변수 또는 메소드 수준에서 사용할 수 있다.

@ModelAttribute 어노테이션이 붙은 객체를 자동으로 생성한다. 

	  @RequestMapping("/ex04")
	  public String ex04(SampleDTO dto, @ModelAttribute("page") int page) {
	    log.info("dto: " + dto);
	    log.info("page: " + page);
	    return "/sample/ex04";
	}

 

@ResponseBody

자바 객체를 JSON기반의 HTTP body로 변환(서버 -> 클라이언트)

파라미터의 타입으로 변환을 요구하는 방식.

 

@RequestBody

JSON기반의 HTTP body(데이터)를 자바 객체(원하는 타입의 객체)로 변환(클라이언트 -> 서버)

 

@ControllerAdvice

공통적인 예외사항을 잡아 처리할 때 사용(해당 객체가 예외를 처리하는 존재임을 명시)

클래스 위에 명시해두고, @ExceptionHandler로 처리하고 싶은 예외를 처리하면 된다.

 

@ExceptionHandler

해당 메서드가 괄호 안에 들어가는 예외타입을 처리한다는 것을 명시.

@Controller, @RestController가 적용된 Bean내에서 발생하는 예외를 잡아서 처리해준다.

  @ExceptionHandler(NoHandlerFoundException.class)	//해당 exception만 처리
  @ResponseStatus(HttpStatus.NOT_FOUND)
  public String handle404(NoHandlerFoundException ex) {
	  return "custom404";
  }

 

@Transactional

해당 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소(롤백)한다.

(DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 달아주면 됨.)

 

REST관련 어노테이션
@RestController
@ResponseBody
@PathVariable
@CrossOrigin
@RequestBody

(Rest는 순수한 데이터를 서버로 전송함.)

 

@RestController

메서드의 리턴타입을 사용자가 정의한 클래스 타입으로 사용할 수 있고, 이를 JSON이나 XML로 자동처리하여 반환 해준다.(Rest API에 선언)

 

@PathVariable

URL 경로의 일부를 파라미터로 사용할 때 사용(주로 REST방식에서 사용함)

{}로 변수명을 지정하고, @PathVariable로 변숫값을 얻는다.

@GetMapping("/product/{cat}/{pid}")
	public String[] getPath(@PathVariable("cat") String cat, @PathVariable("pid") Integer pid) {
		return new String[] {"category: "+cat, "productid "+ pid};
	}

@GetMapping

조회

@PostMapping

등록

@DeleteMapping

삭제

@PutMapping

수정

@PatchMapping

부분수정

 

 

 

 

 

AOP 관련 어노테이션

@Aspect

@Aspect 어노테이션을 적용한 클래스는 PointCut과 Advice 설정 그리고 Aspect 구현을 함께 제공한다.

root-context.xml에 추가해준다.

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

@Before

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

괄호안에 AspectJ의 Pointcut표현식이나, @Pointcut 어노테이션이 적용된 메서드 이름이 올 수 있다.

@Before("execution(* org.zerock.service.SampleService*.*(..))")
	public void logBefore() {
		log.info("========================");
	}

 

@After

타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행

 

@AfterReturning

(정상적 반환 이후)타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행

 

@AfterThrowing

타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행

 

@Around

어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후 또는 예외 발생 시점에 어드바이스 기능을 수행

타겟 메소드에는 ProceedingJoinPoint를 반드시 첫번째 파라미터(매개변수)로 지정해야 함

 *ProceedingJoinPoint: AOP의 대상이 되는 Target이란 파라미터 등을 파악하고, 직접 실행을 결정할 수도 있다.

 

더보기

Pointcut의 설정

구분 설명
execution(@execution) 메서드를 기준으로 Pointcut을 설정
within(@within) 특정한 타입(클래스)을 기준으로 Poincut을 설정
this 주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정
args(@args) 특정한 파라미터를 가지는 대상들만을 Pointcut으로 설정
@annotation 특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정

 

Pointcut 표현식

 

1. return type

* : 모든 리턴타입 허용

void :리턴타입이 void인 메서드

!void :리턴타입이 void가 아닌 메서드

 

2. package

com.wine.aop :com.wine.aop 패키지만 선택

com.wine.aop.. :com.wine.aop로 시작하는 모든 패키지 선택

com.wine.aop..impl :com.wine.aop로 시작하며 마지막 패키지 이름이 impl로 끝나는 패키지 선택 

 

3. class

Advice :Advice클래스만 선택

*Advice :Advice로 끝나는 클래스만 선택

Advice+ :Advice에서 파생된 모드 자식클래스 선택(인터페이스 구현된 모든 클래스)

 

4. method

*(..) :모든 메서드

print*(..) :print로 시작하는 모든 메서드

 

5. arguments(매개변수)

(..) :모든 매개변수

(*) :1개의 매개변수를 가지는 메서드만

(com.devljh.domain.user.model.Use) :매개변수로 User를 가지는 메소드만(풀패키지명으로 적어야됨)

(!com.devljh.domain.user.model.Use) :User를 가지지 않는 메소드만

(Integer, ..) :1개 이상의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인 메소드만

(Integer, *) :2개의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인 메소드만

 

 

security 어노테이션

먼저 sevlet-context.xml에 설정 추가해주기

<security:global-method-security pre-post-annotations="enabled" secured-annotations="enabled"/>

@PostAuthorize

함수를 실행하고 클라이언트에게 응답하기 직전에 권한을 검사

컨트롤러 자체에 적용하면 모든 endpoints에 적용됨.

 

@PreAuthorize

요청이 들어오면 함수를 실행하기 전에 권한을 검사

 

@Secured

표현식(or, and) 사용 불가

'스프링' 카테고리의 다른 글

Spring JDBC  (0) 2022.10.20
Spring Controller  (0) 2022.10.19
Spring MyBatis  (0) 2022.10.18
Spring JDBC  (0) 2022.10.18
Spring의 동작  (0) 2022.10.17