Spring의 주요 개념 회고

은아·2024년 8월 18일

면접 대비 정리

목록 보기
4/5

1. Spring JPA CRUD:

Spring Data JPA는 JPA를 더 쉽게 사용할 수 있게 해주는 모듈입니다. CRUD(Create, Read, Update, Delete) 연산을 쉽게 구현할 수 있습니다.

예시:

public interface MemberRepository extends JpaRepository<Member, Long> {
    Optional<Member> findByPhone(String phone);
}

이 인터페이스는 Member 엔티티에 대한 기본적인 CRUD 연산과 findByPhone 같은 커스텀 쿼리 메서드를 제공합니다.

2. IoC(Inversion of Control)와 DI(Dependency Injection):

IoC는 객체의 생성과 생명주기 관리를 개발자가 아닌 프레임워크가 담당하는 것을 의미합니다. DI는 IoC의 구체적인 구현 방법으로, 객체 간의 의존관계를 외부에서 주입하는 것을 의미합니다.

예시:

@Service
@RequiredArgsConstructor
public class SimpleConsentService {
    private final MemberRepository memberRepository;
    private final ContractCustomRepository contractCustomRepository;
    // ...
}

여기서 Spring이 SimpleConsentService를 생성할 때 필요한 의존성을 자동으로 주입합니다.

3. AOP(Aspect-Oriented Programming):

AOP는 횡단 관심사(로깅, 보안, 트랜잭션 등)를 분리하여 모듈화하는 프로그래밍 패러다임입니다.

예시:

@Transactional
public MemberDetail processSimpleConsent(...) {
    // ...
}

@Transactional 어노테이션은 AOP를 사용하여 트랜잭션 관리를 구현합니다.

4. RESTful API 설계:

REST 원칙을 따르는 API 설계 방식입니다. 이 프로젝트에서는 HTTP 메서드와 URL을 적절히 사용하여 RESTful API를 구현했습니다.

예시:

@RestController
@RequestMapping("/api/v1/simple-consent")
public class SimpleConsentController {
    @PostMapping("/{vendorId}")
    public ResponseEntity<MemberDetail> processSimpleConsent(...) {
        // ...
    }
    // ...
}

5. 엔티티, DTO, 레포지토리, 서비스, 컨트롤러 구조:

이 구조는 관심사의 분리와 계층화된 아키텍처를 위해 사용됩니다.

  • 엔티티: 데이터베이스 테이블과 매핑되는 객체
  • DTO: 계층 간 데이터 전송 객체
  • 레포지토리: 데이터 접근 계층
  • 서비스: 비즈니스 로직 계층
  • 컨트롤러: 요청 처리 및 응답 반환 계층

이 프로젝트에서는 각 계층을 명확히 분리하여 구현했습니다.

6. DTO 설계:

이 프로젝트에서는 DTO를 효과적으로 사용하여 계층 간 데이터 전송을 최적화했습니다.

예시:

public class SimpleConsentRequestDTO {
    private SimpleConsentMemberDTO memberDTO;
    private SimpleConsentPaymentDTO paymentDTO;
    private SimpleConsentContractDTO contractDTO;
}

이렇게 DTO를 세분화하여 각 요청에 필요한 데이터만 전송하도록 설계했습니다. 이는 네트워크 부하를 줄이고, 데이터의 캡슐화를 강화하는 데 도움이 됩니다.


이 프로젝트에서 Spring의 IoC와 DI를 어떻게 활용하셨나요?

답변 1: 이 프로젝트에서는 Spring의 IoC와 DI를 적극적으로 활용했습니다.

예를 들어, SimpleConsentService 클래스를 보면:

@Service
@RequiredArgsConstructor
public class SimpleConsentService {
    private final MemberRepository memberRepository;
    private final ContractCustomRepository contractCustomRepository;
    private final PaymentService paymentService;
    // ...
}

여기서 @Service 어노테이션은 이 클래스가 Spring의 서비스 컴포넌트임을 나타냅니다. Spring의 IoC 컨테이너가 이 클래스의 인스턴스를 생성하고 관리합니다.

@RequiredArgsConstructor와 함께 사용된 final 필드들은 생성자 주입을 통한 DI를 구현합니다. Spring이 SimpleConsentService를 생성할 때, 필요한 의존성(MemberRepository, ContractCustomRepository 등)을 자동으로 주입합니다.

이를 통해 객체 간의 결합도를 낮추고, 테스트와 유지보수가 용이한 구조를 만들 수 있었습니다.

이 프로젝트에서 AOP를 어떻게 활용하셨나요?

답변 2: 이 프로젝트에서는 AOP를 주로 트랜잭션 관리에 활용했습니다.

예를 들어, SimpleConsentService 클래스의 메서드를 보면:

@Transactional
public MemberDetail processSimpleConsent(Long vendorId, SimpleConsentMemberDTO memberDTO,
                                         SimpleConsentPaymentDTO paymentDTO,
                                         SimpleConsentContractDTO contractDTO) {
    // ...
}

여기서 @Transactional 어노테이션은 AOP를 사용하여 트랜잭션 관리를 구현합니다. 이 메서드가 실행될 때, Spring은 트랜잭션을 시작하고, 메서드 실행이 성공적으로 완료되면 트랜잭션을 커밋하며, 예외가 발생하면 롤백합니다.

이를 통해 트랜잭션 관리 코드를 비즈니스 로직에서 분리하여 관심사를 분리하고, 코드의 가독성과 유지보수성을 향상시켰습니다.

이 프로젝트에서 Spring MVC 패턴을 어떻게 구현하셨나요?

답변 3: 이 프로젝트에서는 Spring MVC 패턴을 사용하여 웹 애플리케이션을 구조화했습니다.

예를 들어, SimpleConsentController 클래스를 보면:

@RestController
@RequestMapping("/api/v1/simple-consent")
@RequiredArgsConstructor
public class SimpleConsentController {
    private final SimpleConsentService simpleConsentService;

    @PostMapping("/{vendorId}")
    public ResponseEntity<MemberDetail> processSimpleConsent(@PathVariable Long vendorId, @RequestBody SimpleConsentRequestDTO simpleConsentRequestDTO) {
        // ...
    }

    @GetMapping
    public SimpConsentInfoRes getSimpleConsentInfo(
        @RequestParam(name = "vendor") Long vendorId,
        @RequestParam(name = "contract") Long contractId) {
        // ...
    }
    // ...
}

여기서 @RestController는 이 클래스가 RESTful 웹 서비스의 컨트롤러임을 나타냅니다. @RequestMapping은 이 컨트롤러의 기본 URL 경로를 지정합니다.

각 메서드의 @PostMapping, @GetMapping 등은 HTTP 메서드와 URL을 매핑합니다. 이들이 Controller 역할을 합니다.

Service 계층(예: SimpleConsentService)이 Model 역할을 담당하며, 비즈니스 로직을 처리합니다.

View는 이 프로젝트에서 직접적으로 보이지 않지만, 클라이언트 사이드(React)에서 처리되는 구조로 보입니다.

이러한 MVC 패턴 구현을 통해 관심사를 분리하고, 코드의 재사용성과 유지보수성을 높였습니다. 또한 RESTful API 설계를 통해 클라이언트와 서버 간의 효율적인 통신을 가능하게 했습니다.

profile
Junior Developer 개발 기술 정리 블로그

0개의 댓글