from. 코드로 배우는 스프링 웹 프로젝트
Lombok관련 어노테이션
1. @Setter : @Setter는 말 그대로 setter메서드를 생성해 주는 역할을 합니다. @Setter에는 3가지 속성을 부여할 수 있습니다.
1) value : 접근 제한 속성을 의미
2) onMethod : setter 메소드의 생성 시 메서드에 추가할 어노테이션을 지정
3) onParam : setter 메소드의 파라미터에 어노테이션을 사용하는 경우에 적용
2. @Data : Lombok에서가장 자주 사용되는 어노테이션입니다. @Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter 등을 모두 결합한 형태로 한 번에 자주 사용되는 모든 메서드들을 생성 할 수 있다는 장점이 있습니다.
3. @Log4j : 로그 객체를 생성합니다.
스프링관련 어노테이션
1. @Controller : Controller의 역할을 수행 한다고 명시, 추가하게 되면 스프링의 빈으로 인식
2. @RequestMapping : 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지 맵핑하기 위한 어노테이션
3. @Component : 해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시하는 어노테이션입니다. @Component가 있는 클래스를 스프링이 읽어 주도록 @ComponentScan을 통해서 지정되어 있는 해당 패키지에 있는 클래스들을 조사하면서 @Component가 존재하는 클래스들을 객체로 생성해서 빈으로 관리합니다.
4. @Autowired : 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시의 어노테이션입니다.
5. @Service : 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해서 사용
6. @Allargsconstructor : 모든 파라미터를 이용하는 생성자
7. @NoArgsConstructor : 기본 생성자
테스트관련 어노테이션
1. @ContextConfiguration : 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지를 명시합니다.
1) location 속성 : locations를 이용해서 XML설정 파일을 명시
2) classes 속성 : @Configuration이 적용된 클래스를 지정
2. @Runwith : 테스트 시 필요한 클래스를 지정합니다. (ex) 스프링에서는 @RunWith(SpringJUnit4ClassRunner.class)
3. @Test : 단위테스트 대상을 명시
예)
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@ContextConfiguration(classes = { org.zerock.config.RootConfig.class})
@Log4j
public class TimeMapperTests {
@Setter(onMethod_ = @Autowired)
private TimeMapper timeMapper;
@Test
public void testGetTime() {
log.info(timeMapper.getClass().getName() );
log.info(timeMapper.getTime());
}
@Test
public void testGetTime2() {
log.info("getTime2");
log.info(timeMapper.getTime2());
}
}
강제로 전달받은 파라미터를 화면에서 사용하고싶을때
1. @ModelAttribute : 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 떄 필요한 어노테이션입니다. @ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에담아서 전달되므로, 파라미터로 전달된 데이터를 다시 화면에서 사용해야 할 경우에 유용하게 사용됩니다.
아래 코드에서 http://localhost:8080/sample/ex04?name=aaa&age=11&page=9 를 실행하게 되면
SampleDTO에 대해서는 파라미터를 받아오지만 int page값은 받아오지 못하고있다.
@Data
public class SampleDTO {
private String name;
private int age;
}
@GetMapping("/ex04")
public String ex04(SampleDTO dto, int page) {
log.info("dto: " + dto);
log.info("page : " +page );
return "/sample/ex04";
}
아래와 같이 @ModelAttribute 어노테이션을 이용해서 강제로 받아올 수 있다.
@GetMapping("/ex04")
public String ex04(SampleDTO dto, @ModelAttribute("page") int page) {
log.info("dto: " + dto);
log.info("page : " +page );
return "/sample/ex04";
}
예외처리
1. @ExceptionHandler와 @ControllerAdvice를 이용한 처리
1) @ControllerAdvice는 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도로 사용
2) @ExceptionHandler는 해당 메서드가 () 들어가는 예외 타입을 처리한다는 것을 의미
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
@ExceptionHandler(Exception.class)
public String except(Exception ex, Model model) {
log.error("Exception........" + ex.getMessage());
model.addAttribute("exception", ex);
log.error(model);
return "error_page";
}
}
REST관련 어노테이션
1. @RestController : Controller가 REST 방식을 처리하기 위한 것임을 명시합니다. @RestController는 메서드의 리턴 타입으로 사용자가 정의한 클래스 타입을 사용할 수 있고, 이를 JSON이나 XML로 자동으로 처리할 수 있습니다.
2. @ResponseBody : 일반적인 JSP와 같은 뷰로 전달되는 게 아니라 데이터 자체를 전달하기 위한 용도입니다. JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 주로 사용합니다.
3. @PathVariable : URL 경로에 있는 값을 파라미터로 추출하려고 할 때 사용합니다. 일반 컨트롤러에서도 사용이 가능하지만 REST방식에서 자주 사용됩니다. URL에서 '{ }'로 처리된 부분은 컨트롤러의 메서드에서 변수로 처리가 가능합니다.
@GetMapping("/product/{cat}/{pid}")
public String[] getPath(
@PathVariable("cat") String cat,
@PathVariable("pid") Integer pid) {
return new String[] { "category: " + cat, "productID : " + pid };
}
4. @CrossOrigin : Ajax의 크로스 도메인 문제를 해결해주는 어노테이션
5. @RequestBody : JSON 데이터를 원하는 타입으로 바인딩 처리
AOP 어노테이션
1. @Aspect : 해당 클래스의 객체가 Aspect를 구현한 것임으로 나타내기 위해서 사용합니다.
- Aspect : 책에서는 "관심사 자체를 의미하는 추상 명사"라고 표현하고 있습니다. 말이 조금 추상적이므로 쉽게 말하자면 개발시 필요한 고민이나 염두해 두어야 하는 일을 관심사라고 생각하시면 됩니다. 예를들어 핵심 로직은 아니지만 로그가 제대로 찍히고 있는지, 사용자가 적절한 권한을 가진 사용자.. 등등 개발할때 관심있게 생각하는 것들을 관심사(Aspect)라고 생각하시면 됩니다.
2. @Transactional : 트랜잭션 단위로 처리하기 위해 선언하는 어노테이션입니다. @Transactional 어노테이션을 이용한 설정만으로 애플리케이션 내의 트랜잭션에 대한 설정을 처리할 수 있습니다. @Transactional은 메서드, 클래스, 인터페이스 모두 선언 가능합니다. ( 우선순위 : 메서드 > 클래스 > 인터페이스)
2-1) 트랜잭션이란 : 사전적인 의미는 거래라는 뜻을 가지지만, 여기선 '한 번에 이루어지는 작업의 단위'를 의미합니다. 즉 @Transactional 어노테이션이 붙게 되면, 하나의 트랜잭션에서 여러 작업이 수행될때 그중 하나라도 fail이 되면 그 트랜잭션은 수행되지 못합니다.
2-2) 예를들면, @Transactional가 붙은 어느 메소드가 insert를 실행하는 매퍼 2개를 포함하고 있는데 그 중 1개가 실패하게 되면, 나머지 하나가 성공해도 다시 rollback(returned)하게 됩니다.
'Spring' 카테고리의 다른 글
Resilience4j Circuit Breaker에 대해서 (0) | 2023.12.03 |
---|---|
[spring] @Transactional과 rollback에 대해서 (0) | 2023.11.16 |
스프링과 스프링 부트 (0) | 2020.03.28 |