- Controller: 요청을 처리에 매핑하고 결과를 뷰에 넘겨주는 제어를 함. 주요 처리는 Controller 안에서 실행하지 않고 '도메인 레이어'의 Service를 호출.
- Form: 화면의 폼을 표현. 입력한 값을 Controller에 넘겨주며, Controller에서 화면에 결과를 출력할 때도 사용. 도메인 레이어가 애플리케이션 레이어에 의존하지 않도록 Form에서 도메인 객체로 변환하거나 도메인 객체에서 Form으로 변환하는 것을 애플리케이션 레이어에서 수행.
- View: 화면 표시를 담당.
2) 도메인 레이어
- 도메인 객체에 대해 애플리케이션의 서비스 처리를 실행.
- Entity: 서비스 처리를 실행할 때 필요한 자원.
- Service: 애플리케이션의 서비스 처리를 담당.
- Repository: 인터페이스. 데이터베이스의 데이터 조작 내용만 정의(구현 내용은 작성하지 않음).
3) 인스라스트럭처 레이어
- 도메인 객체에 대해 CRUD 조작을 해서 데이터의 영속화를 담당.
- Repositorylmpl: 도메인 레이어에서 정의한 Repository의 구현 클래스.
- O/R Mapper: O(Object; 객체)와 R(Relational; 관계형 데이터베이스) 간의 데이터를 매핑
3. 데이터베이스/프로젝트 생성
1) dependencies
- Spring Boot DevTools: 스프링 부트 개발 툴. 자동 재실행 등 개발에 편리한 기능 포함.
- Lombok: 어노테이션을 부여하는 것으로 getter와 setter 등을 코드로 작성하지 않아도 자동으로 구현해줌.
- Spring Data JDBC: 스프링 데이터에서 제공하는 OR Mapper.
- Validation: 유효성 검사 기능인 'Bean Validation'과 'Hibernate Validator'를 사용할 수 있게 함.
- 직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있음
- 지정하는 조건 방법에는 포인트 컷 사용
- execute(반환값 패키지.클래스.메서드(인수))
package me.yuan.bookstudy.used.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
@Aspect//어드바이스를 기술하는 클래스@Component//인스턴스 생성publicclassSampleAspect{
@Before("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 전에 호출publicvoidbeforeAdvice(JoinPoint joinPoint){
//시작 부분 표시
System.out.println("=== Before Advice ===");
//날짜를 출력
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
//메서드 이름 출력
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
@After("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 후에 호출publicvoidafterAdvice(JoinPoint joinPoint){
//시작 부분 표시
System.out.println("=== After Advice ===");
//날짜를 출력
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
//메서드 이름 출력
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
@Around("execution(* me.yuan.bookstudy.used.*Greet.*(..))")//메서드 실행 전후에 호출public Object aroundAdvice(ProceedingJoinPoint joinPoint)throws Throwable {
//시작 부분 표시
System.out.println("=== Arou줌d Advice ===");
System.out.println("*** 처리전 ***");
//지정한 클래스의 메서드 실행
Object result = joinPoint.proceed();
System.out.println("*** 처리후 ***");
//반환값을 돌려줄 필요가 있는 경우에는 Object 타입의 반환값을 돌려줌return result;
}
}
4) Around Advice와 다른 어드바이스와의 차이
- 인수는 ProceedingJoinPoint 인터페이스 타입을 지정
- 어드바이스 중에서 ProceedingJoinPoint 인터페이스의 proceed() 메서드를 호출
- 어드바이스 적용 대상의 메서드를 임의의 타이밍으로 호출할 수 있으므로 전후로 다양한 처리가 가능
7. @Transactional
- 트랜잭션 관리에 사용하는 어노테이션
- 데이터베이스 액세스 처리 메서드가 정상 종료하면 트랜잭션을 커밋하고 예외가 발생하면 롤백