본문 바로가기

DEV_BACKEND/Spring

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 32일차 Spring 2

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

: 스프링 프레임워크의 핵심 도구로, 메타데이터를 사용해 애플리케이션 동작을 정의하고 제어.

메타데이터를 코드에 포함하여 스프링이 객체의 동작과 구성을 제어할 수 있도록 돕습니다.

 

주요 목적:

  1. (Bean)의 관리와 구성.
  2. 의존성 주입.(DI)
  3. 애플리케이션의 동작을 특정 기준에 따라 변경.

주요 애너테이션 종류와 역할:

  1. 의존성 주입 관련:
    • @Autowired: 스프링 컨테이너에서 자동으로 빈을 주입.
    • @Qualifier: 동일한 타입의 여러 빈 중 특정 빈을 지정.
    • @Inject: JSR-330 표준 의존성 주입.
    • @Resource: JSR-250 의존성 주입.
  2. 빈 관리:
    • @Component: 해당 클래스를 스프링 빈으로 등록.
    • @Controller: MVC 패턴의 컨트롤러 역할.
    • @Service: 서비스 계층을 나타내는 클래스.
    • @Repository: 데이터 접근 계층을 나타내며 예외 변환 지원.
  3. 설정 관련:
    • @Configuration: 자바 기반 설정 파일을 나타냄.
    • @Bean: 개발자가 수동으로 빈을 등록할 때 사용.
    • @PropertySource: 외부 프로퍼티 파일을 읽어 설정.
  4. AOP 관련:
    • @Aspect: AOP를 구현하기 위해 클래스에 부여.
    • @Before: 메서드 실행 전에 수행할 작업 정의.
    • @After: 메서드 실행 후에 수행할 작업 정의.
    • @Around: 메서드 실행 전후에 수행할 작업 정의.
  5. MVC 관련:
    • @RequestMapping: 특정 URL과 메서드를 매핑.
    • @GetMapping, @PostMapping: HTTP 메서드에 따라 매핑.
    • @PathVariable: URL 경로에서 값을 추출.
    • @RequestParam: 쿼리 파라미터에서 값을 추출.
    • @ModelAttribute: 모델에 데이터 바인딩.
  6. 테스트 관련:
    • @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 주요 개념

  1. @Aspect
    • 횡단 관심사를 캡슐화한 모듈입니다. (예: 로깅, 트랜잭션 처리)
  2. Advice
    • 특정 시점에 실행되는 실제 동작 코드입니다. (예: 메서드 실행 전/후 동작)
    • 종류:
      • @Before: 메서드 실행 전에 동작
      • @After: 메서드 실행 후 동작
      • @Around: 메서드 실행 전후 모두 동작
      • @AfterReturning: 메서드가 정상적으로 실행된 후 동작
      • @AfterThrowing: 예외 발생 시 동작
  3. Join Point
    • Advice가 적용 가능한 시점입니다. (예: 메서드 호출, 필드 접근 등)
  4. Pointcut
    • Advice가 실행될 Join Point를 결정하는 표현식.
    • 스프링에서는 execution 또는 @annotation 등을 사용해 Pointcut을 정의함.
  5. 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 흐름:
    1. 사용자가 요청 -> DispatcherServlet이 요청 수신.
    2. HandlerMapping을 통해 적합한 Controller를 찾음.
    3. Controller가 요청을 처리하고 Model에 데이터 저장.
    4. ViewResolver를 통해 알맞은 뷰를 찾아 응답.
    5. 사용자에게 최종 결과 전달.

Model1 vs Model2 비교

항목 Model1 Model2
구조 단순, JSP 중심 MVC 분리, 계층 구조
유지보수 어려움 용이
적합성 소규모 프로젝트 대규모 프로젝트
스프링 지원 지원하지 않음 완전 지원

 

결론

  1. AOP는 횡단 관심사를 분리하여 효율적으로 관리하고, 스프링에서는 Aspect를 통해 구현합니다.
  2. MVC는 역할 분리를 통해 코드의 가독성과 유지보수를 개선하며, Spring MVC는 Model2 아키텍처를 기반으로 작동합니다.