1. Optional: Null 처리를 우아하게 관리하여 코드 안정성을 높이는 도구.
Java 8에서 도입된 ‘클래스’, 스프링에서 Null값을 처리하거나 의존성을 더 안전하게 관리하는 데 자주 사용됨. (예외처리를 메서드로 한다)
주요 메서드:
- Optional.of(value): 절대 null이 아닌 값을 감싸는 Optional 객체를 반환합니다. 값이 null이면 예외를 발생시킵니다.
- Optional.ofNullable(value): 값이 null일 가능성이 있을 때 Optional 객체로 감쌉니다.
- Optional.empty(): 빈 Optional 객체를 생성합니다.
- orElse(defaultValue): Optional 값이 비어있을 경우 기본값을 반환합니다.
- orElseThrow(exceptionSupplier): 값이 없으면 예외를 던집니다.
- map(function): Optional 내부 값을 변환합니다.
- ifPresent(consumer): Optional 값이 존재할 경우 수행할 작업을 정의합니다.
예)
서비스 계층에서 반환 값 처리:
public Optional<User> findUserByEmail(String email) {
return userRepository.findByEmail(email);
}
빈 값 검증:
public void printUserNameIfExists(Long id) {
userRepository.findById(id)
.ifPresent(user -> System.out.println(user.getName()));
}
장점:
- 명시적으로 값이 없음을 처리함으로써 코드의 안정성을 높입니다.
- Null 처리 로직을 간결하게 작성할 수 있습니다.
2. Annotation
: 스프링 프레임워크의 핵심 도구로, 메타데이터를 사용해 애플리케이션 동작을 정의하고 제어.
메타데이터를 코드에 포함하여 스프링이 객체의 동작과 구성을 제어할 수 있도록 돕습니다.
주요 목적:
- 빈(Bean)의 관리와 구성.
- 의존성 주입.(DI)
- 애플리케이션의 동작을 특정 기준에 따라 변경.
주요 애너테이션 종류와 역할:
- 의존성 주입 관련:
- @Autowired: 스프링 컨테이너에서 자동으로 빈을 주입.
- @Qualifier: 동일한 타입의 여러 빈 중 특정 빈을 지정.
- @Inject: JSR-330 표준 의존성 주입.
- @Resource: JSR-250 의존성 주입.
- 빈 관리:
- @Component: 해당 클래스를 스프링 빈으로 등록.
- @Controller: MVC 패턴의 컨트롤러 역할.
- @Service: 서비스 계층을 나타내는 클래스.
- @Repository: 데이터 접근 계층을 나타내며 예외 변환 지원.
- 설정 관련:
- @Configuration: 자바 기반 설정 파일을 나타냄.
- @Bean: 개발자가 수동으로 빈을 등록할 때 사용.
- @PropertySource: 외부 프로퍼티 파일을 읽어 설정.
- AOP 관련:
- @Aspect: AOP를 구현하기 위해 클래스에 부여.
- @Before: 메서드 실행 전에 수행할 작업 정의.
- @After: 메서드 실행 후에 수행할 작업 정의.
- @Around: 메서드 실행 전후에 수행할 작업 정의.
- MVC 관련:
- @RequestMapping: 특정 URL과 메서드를 매핑.
- @GetMapping, @PostMapping: HTTP 메서드에 따라 매핑.
- @PathVariable: URL 경로에서 값을 추출.
- @RequestParam: 쿼리 파라미터에서 값을 추출.
- @ModelAttribute: 모델에 데이터 바인딩.
- 테스트 관련:
- @SpringBootTest: 스프링 부트 통합 테스트 환경 구성.
- @MockBean: 테스트를 위해 가짜 빈 생성.
예)
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.findAllUsers();
}
}
장점:
- XML이나 Java 코드 기반 설정의 복잡성을 줄이고 가독성을 높입니다.
- 동작과 구성을 코드와 더 가깝게 유지하여 유지보수가 쉬워집니다.
3. AOP
: 부가적인 기능(e.g., 로깅, 트랜잭션 처리, 보안, 성능 모니터링 등)을 핵심 비즈니스 로직과 분리함.
AOP 주요 개념
- @Aspect
- 횡단 관심사를 캡슐화한 모듈입니다. (예: 로깅, 트랜잭션 처리)
- Advice
- 특정 시점에 실행되는 실제 동작 코드입니다. (예: 메서드 실행 전/후 동작)
- 종류:
- @Before: 메서드 실행 전에 동작
- @After: 메서드 실행 후 동작
- @Around: 메서드 실행 전후 모두 동작
- @AfterReturning: 메서드가 정상적으로 실행된 후 동작
- @AfterThrowing: 예외 발생 시 동작
- Join Point
- Advice가 적용 가능한 시점입니다. (예: 메서드 호출, 필드 접근 등)
- Pointcut
- Advice가 실행될 Join Point를 결정하는 표현식.
- 스프링에서는 execution 또는 @annotation 등을 사용해 Pointcut을 정의함.
- Weaving
- Aspect를 실제 코드에 적용하는 과정. (컴파일, 로드, 런타임 시점에 수행 가능)
- 스프링에서는 런타임 시점에 프록시 기반으로 Weaving이 이루어집니다.
@Aspect
@Component
public class KitchenManager { //로깅, 트랜잭션 처리, 보안, 성능 모니터링 등
@Before("execution(* com.restaurant.Chef.cook(..))")
public void washHands() {
System.out.println("손 씻기 완료");
}
@After("execution(* com.restaurant.Chef.cook(..))")
public void cleanKitchen() {
System.out.println("주방 청소 완료");
}
}
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before Method: " + joinPoint.getSignature().getName());
}
}
4. MVC (Model-View-Controller)
MVC는 애플리케이션의 구조를 Model(데이터와 비즈니스 로직), View(사용자 인터페이스), Controller(사용자 요청 처리 및 로직 제어)로 분리하여 개발하는 아키텍처 패턴.
Model1 vs Model2 (Spring MVC)
Model1 아키텍처
- 구조:
- View와 Controller의 구분이 없음. JSP가 모든 역할을 수행.
- 특징:
- 단순한 구조로 소규모 프로젝트에 적합.
- 비즈니스 로직과 뷰 로직이 혼합되어 유지보수와 확장이 어려움.
- 예시:
<%-- JSP 내부에서 직접 비즈니스 로직 처리 --%>
<%
String data = request.getParameter("data");
out.println("Processed Data: " + data);
%>
Model2 아키텍처 (Spring MVC의 기반)
- 구조:
- View와 Controller가 명확히 분리됨.
- Controller가 사용자 요청을 처리하고 비즈니스 로직을 실행한 후, 결과를 Model에 담아 View로 전달.
- 특징:
- 계층 분리가 명확하여 유지보수와 확장이 용이.
- 대규모 프로젝트에서 필수적.
- 스프링 MVC 흐름:
- 사용자가 요청 -> DispatcherServlet이 요청 수신.
- HandlerMapping을 통해 적합한 Controller를 찾음.
- Controller가 요청을 처리하고 Model에 데이터 저장.
- ViewResolver를 통해 알맞은 뷰를 찾아 응답.
- 사용자에게 최종 결과 전달.
Model1 vs Model2 비교
| 항목 | Model1 | Model2 |
| 구조 | 단순, JSP 중심 | MVC 분리, 계층 구조 |
| 유지보수 | 어려움 | 용이 |
| 적합성 | 소규모 프로젝트 | 대규모 프로젝트 |
| 스프링 지원 | 지원하지 않음 | 완전 지원 |
결론
- AOP는 횡단 관심사를 분리하여 효율적으로 관리하고, 스프링에서는 Aspect를 통해 구현합니다.
- MVC는 역할 분리를 통해 코드의 가독성과 유지보수를 개선하며, Spring MVC는 Model2 아키텍처를 기반으로 작동합니다.
'DEV_BACKEND > Spring' 카테고리의 다른 글
| [멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 41일차 웹 프로그램 실습-1 (2) | 2025.02.07 |
|---|---|
| [멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 40일차 스트림 (0) | 2025.02.06 |
| [멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 37일차 쿠키, 세션 그리고 토큰 (2) | 2025.02.03 |
| Spring AOP 개념 심화 (1) | 2025.01.21 |
| [멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 30일차 Spring (1) | 2025.01.16 |