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 |