귀농 전까지 쓰는 개발 일지

<Spring> Annotation 정리 본문

공부/Spring

<Spring> Annotation 정리

한호잉 2023. 4. 17. 21:47

@PostConstruct 

패키지 이름 변경 

javax.annotation.PostConstruct -> jakarta.annotation.PostConstruct

 

 

@Controller 

스프링이 해당 클래스를 컨트롤러로 지정함 (웹 애플리케이션에서 요청을 처리하기 위한 메소드들 작성)

 

 

@GetMapping

HTTP GET 요청 처리, 메소드에서 처리할 URL 패턴 지정 가능 

@GetMapping("/hello")

 

 

@ResponseBody

컨트롤러 메소드가 반환하는 데이터를 HTTP 응답 본문으로 전송하기 위한 어노테이션

@GetMapping("/hello") 
@ResponseBody 
public String sayHello() {
	return "Hello, World!"; 
}

* 객체 반환시 JSON or XML 형태로 변환됨

 

 

@RequestParam

HTTP 요청 파라미터를 컨트롤러 메소드의 매개변수로 전달하기 위한 어노테이션

@GetMapping("/search") 
public String search(@RequestParam("query") String query) {
	... 
}

* 필수 파라미터 여부, 기본값, 데이터 타입 등 설정 가능

 

 

@Test 

JUnit 테스트를 실행하기 위한 어노테이션

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class MyTest { 
	@Test
    public void myTest() {
    	... 
    } 
}

* @Test(expected = Exception.class) 과 같이 해당 테스트 메소드가 지정한 예외를 발생시켜야 성공하는지도 검증 가능

 

 

@AfterEach

테스트 메소드 중 하나가 실행된 후 특정 동작을 수행하도록 지정  (==후 처리)

매개변수가 없으며 리턴타입도 void로 지정

    @AfterEach
    public void afterEach(){
        //테스트 끝날떄마다 repository 초기화
        repository.clearStore();
    }

*JUnit4: @After

 JUnit5: @AfterEach

 

 

@Autowired 

의존성 주입(Dependency Injection)위해 사용, Spring이 자동으로 해당 타입의 빈을 찾아 주입

Ex) Service 객체를 주입받는 Controller 클래스 작성시, Controller 클래스 객체 생성시 자동으로 Service 객체를 생성하여 주입해줌

*생성자가 1개만 있을시 생략가능

 

 

@Component

해당 클래스가 Spring의 IoC 컨테이너에 빈으로 등록됨을 나타냄, 클래스를 스캔하여 자동으로 빈 등록

Ex) MemberService클래스 등록시 빈 이름은 memberService가 됨 

* @Service @Repository @Controller는 @Component 기능을 상속받음 

 

 

@Bean

정형화 되지 않거나 구현 클래스를 변경해야 한다면 자바코드를 통해 Spring Bean으로 등록함 

 *@Qualifier로 빈 이름 지정 가능

 

 

@Configuration

Configuation 클래스 (여러 빈을 생성하고 구성하는 역할)를 정의함 

@Configuration
public class SpringConfig { 
    @Bean
 	public MemberService memberService() {
 		return new MemberService(memberRepository());
 	}
}

* @Profile 사용하여 환경별로 다른 빈 설정 가능 

 

 

@SpringBootTest

스프링 컨테이너와 테스트를 함께 실행한다. Spring Boot 애플리케이션의 전체 구성을 로드하여 실제 실행되는 애플리케이션과 동일한 환경에서 테스트 수행이 가능함

 

 

@Transactional 

데이터베이스 트랜잭션 범위를 설정함, 격리 수준/제한시간/롤백 조건등 지정 가능

Ex) 테스트 케이스에 존재시, 테스트 시작 전 트랜잭션을 시작하고 완료 후 항상 롤백 (DB에 데이터가 남지 않음)

*JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 함 

 

 

@Aspect 

AOP (Aspect Oriented Programming: 프로그램의 횡단 관심사를 모듈화 하여 코드의 중복을 줄이고 유지 보수성을 높히기 위함) 모듈에서 사용. 

*@Before @After @Around등을 통해 메소드 호출 전/후 예외발생 시점등의 횡단 관심사에 대한 처리를 구현할 수 있음

 

@Around

AOP 횡단 관심사를 처리하기 위한 로직, 메소드 실행 전과 후에 처리해야 할 로직을 포함함

* ProceedingJoinPoint 객체를 받아 proceed()메소드를 호출하여 해당 메소드를 실행 함 

@Component
@Aspect
public class TimeTraceAop {
     @Around("execution(* hello.hellospring..*(..))")
     public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
         long start = System.currentTimeMillis();
         System.out.println("START: " + joinPoint.toString());
         
         try {
             return joinPoint.proceed();
         } finally {
             long finish = System.currentTimeMillis();
             long timeMs = finish - start;
             System.out.println("END: " + joinPoint.toString()+ " " + timeMs + "ms");
         }
     }
}  //시간 측정 AOP