o-ohi-code 님의 블로그

[Spring Framework] 어노테이션 정리-1 본문

프레임워크(Framework)

[Spring Framework] 어노테이션 정리-1

o-ohi-code 2025. 4. 4. 21:42

@Autowired 

@Autowired 는 스프링이 알아서 객체를 찾아서 넣어주는 (DI / 의존성 주입) 어노테이션이다.
@Autowired
	BaseServiceFacade baseServiceFacade;
  • BaseServiceFacade 라는 객체를 직접 new(생성) 하지 않아도 스프링이 미리 만들어놓은 Bean(객체) 자동으로 주입
  • + Bean 을 통해(의존성 관리),
  • + @Autowired 를 통해 (의존성 주입)

@Aspect 

현재 클래스가 AOP 기능을 담고 있는 클래스를 스프링에게 명시해주는 어노테이션
@Component
@Aspect
@Slf4j
public class LoggerAspect {
 // 코드
}
  • 이 클래스는 반드시 @Component나 @Configuration으로 Bean 등록을 해야한다.
  • 그래야 Spring 컨테이너가 이 클래스를 관리하고 AOP를 적용 할 수 있다.

@Around 

특정 메서드의 실행 전, 실행 후, 예외 발생 시점까지 모두 감싸서 제어할 수 있는 
AOP 어노테이션이다.

 

https://o-ohi-code.tistory.com/35

 

[Spring] AOP 란?

AOP (Aspect-Oriented Programming)공통 기능을 분리해서 코드 중복 없이 관리하는 기법  핵심 로직은 그대로 두고, 부가적인 기능(로깅, 트랜잭션, 보안 등) 만 따로 떼어내는 것을 말한다.🤔 AOP 왜 사용

o-ohi-code.tistory.com

@Component
@Aspect
@Slf4j
public class LoggerAspect {
	  //Logger log = LoggerFactory.getLogger(getClass());

	// @Around("execution(* com..handler.*.*(..)) or execution(* com..service.*.*(..)) or execution(* com..dao.*.*(..))")
	@Around("execution(* kr.co.erp..controller..*(..)) || execution(* kr.co.erp..servicefacade..*(..)) || execution(* kr.co.erp..dao..*(..))")
	public Object logPrint(ProceedingJoinPoint joinPoint) throws Throwable {

 

@AllArgsConstructor

클래스의 모든 필드를 파라미터로 받는 생성자를 자동으로 만들어주는 Lombok 어노테이션
@AllArgsConstructor
public class EmpUpdateTO {
    private String birthDate;
    private String deptCode;
    private String empCode;
    private String empName;
    private String gender;
    private String authorityCodeNumber;
    private String basicAddress;
    private String detailAddress;
    private String email;
    private String levelOfEducation;
    private String phoneNumber;
    private String positionCode;
    private String userId;
    private String workplaceCode;
    private String zipCode;
}

// 모든 필드 포함 생성자 (@AllArgsConstructor)
    public EmpUpdateTO(String birthDate, String deptCode, String empCode, ..., String zipCode) {
        this.birthDate = birthDate;
        this.deptCode = deptCode;
        ...
        this.zipCode = zipCode;
    }

AllArgumentsConstructor (모든/매개변수/생성자) : 모든 필드 값을 넣을 수 있는 생성자를 만들어 준다는 뜻이다.

이렇게 되면 생성자(new)를 만들 때 바로 값을 넣어 줄 수 있는 편리함이 생긴다.

// 이런식으로 
EmpUpdateTO emp = new EmpUpdateTO("E001", "영웅", "010-0000-0000", "D001", ...);

 

🤔 하지만 여기서 드는 의문

   현재 예제) 코드는 DTO 클래스로,

  • MyBatis : SQL 쿼리 결과를 DTO의 setter 로 주입한다.
  • JPA : DB 에서 값을 가져올 때 기본 생성자 + setter 로 객체를 생성한다.

그래서 DTO는 기본 생성자(@NoArgsConstructor) 만 있으면 된다!

 

그럼 @AllArgsConstructor 는 왜 사용하는 걸까?

ex1) 테스트 코드에서 직접 객체 생성해야 할 때,
  테스트 코드, Mock 객체 만들 때 빠르게 세팅 가능!
   EmpUpdateTO emp = new EmpUpdateTO("E001", "영웅", "010-0000-0000", ...);

ex2) 서비스 컨트롤러 간 데이터 넘길 때 빠르게 만들고 싶을 때
  setter 여러 번 안 쓰고 깔끔하게 처리 가능
  return new EmpUpdateTO(empCode, empName, ..., zipCode);

ex3) 값이 고정된 샘플 객체 만들 때
   초기값 고정할 때 유리
   return new EmpUpdateTO("E999", "테스트직원", ..., "00000");

 

 

 

 

 

'프레임워크(Framework)' 카테고리의 다른 글

Web Framework 란?  (1) 2025.04.09
[Framework] 프레임워크란?  (0) 2025.04.04