웹 백엔드 개발/Spring Boot

[Spring Boot] 스프링부트 기본 개념 (MVC, IoC, DI, AOP, PSA)

iinana 2025. 1. 7. 13:43
728x90

1. MVC 패턴

참고자료: https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

Controller, Service, Repository 가 무엇일까?

찾아본 결과 Controller가 무엇인지 알기 전에 MVC 패턴에 대하여 먼저 아는 것이 중요합니다!MVC패턴은 Model-View-Controller의 약자로서 개발을 할 때 3가지 형태로 역학을 나누어 개발하는 방법론입니

velog.io

 

 MVC는 Model, View, Controller의 약자로 개발을 할 때, 이 3가지 형태로 나누어 개발하는 방법론이다. 쉽게 이해하면 모든 기능이 몇천 줄의 코드를 가진 하나의 파일로 모여있으면 유지보수를 할 때 힘드니 이를 나누어서 나중에 무언가를 변경하거나 유지보수하기 편하게 할 수 있다. 

 Model, View, Controller는 각각 아래와 같다. 

Model: 애플리케이션이 무엇을 할 것인지 정의하는 부분. DB와 연동하여 데이터를 다루는 역할을 함. 
View: 사용자에게 시각적으로 보여지는 부분 (UI)
Controller: Model이 데이터를 어떻게 처리할지 알려주는 역할을 한다. 즉 요청을 처리한 후 지정된 뷰에 모델 객체를 넘겨주는 역할을 한다.

 

 결국  controller를 이용하여 아래와 같은 순서로 사용자 요청이 처리된다. 쉽게 말하면 controller가 요청을 받아서 분기처리를 해서 service에 넘기면 service가 실질적인 요청 처리를 해서 사용자에게 결과를 반환한다. controller가 어떤 요청인지 파악하는 역할, service가 그 요청을 수행하는 역할이라고 생각하면 된다.

(사용자 요청) --> (Controller) --(처리할 사항)--> (Service)
(Service) --(처리된 내용)--> (Controller) --> (사용자)

 

 

2. IoC(Inversion of Control, 제어 역전)

  IoC는 다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것을 말한다. 아래 설명할 DI가 사실상 IoC 구현을 위해 사용되는 방법이라고 볼 수 있다.

 

3. DI (Dependency Injection, 의존성 주입)

참고자료: https://velog.io/@jeong-god/DI%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

DI란 무엇인가

DI란 무엇인가. Dependency Injection의 줄임말로 의존성 주입이라고 한다.의존성어떤 "서비스"를 호출하려는 그 "클라이언트"는 그 "서비스"가 어떻게 구성되었는지 알

velog.io

 

 의존성을 주입한다는 것은 쉽게 말하면, 서로 연관이 있는 두 가지를 스프링이 연결해 주는 것을 의미한다. 예를 들어  MemberController와 MemberService가 있다고 해보자. 여기서 MemberService는 MemberController 내에서 이용되어야 한다. 이 둘은 서로 연관이 있으며, MemberController만이 MemberService를 이용할 수 있다고 해보자. 이 둘을 연결시켜 주는 것을 연관성 주입이라고 할 수 있고, 이를 @Autowired 어노테이션 등을 이용하여 할 수 있다는 것이 간단한 설명이다. 

의존성 주입을 하지 않으면 코드의 재활용성 등의 문제가 발생할 수 있기 때문에 DI를 사용하여 이런 문제들을 방지하는 것이다. 

 

 스프링에서 DI를 사용하는 데에는 세 가지 방법이 있다.  자세한 구현 방식은 위 참고자료 링크에서 확인이 가능하다. 이 중 생성자 주입이 권장된다. (의존 관계가 실행 중 동적으로 변하는 경우가 거의 없기 때문)

(1) 생성자 주입 (Constructor Injection)

@Controller
public class MemberController {
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

(2) 필드 주입 (Field Injection) 

@Controller
public class MemberController {
    @Autowired private MemberService memberService;
}

 

(3) 수정자 주입 (Setter Injection)

@Controller
public class MemberController {
    private MemberService memberService;
    
    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
}

 


4. AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)

  프로그래밍에 대한 관점을 핵심 관점과 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의미한다. 각 프로그램의 핵심 관점은 그 프로그램에서 직접 운영하고 관리하면 되지만, 여러 프로그램에서 함께 필요한 부가 관점 같은 경우는 이에 해당하는 관점을 모듈화 해서 운영하면 핵심 관점 코드에만 집중할 수 있게 되고, 프로그램 확장에도 유리해진다.

 예를 들어, 은행 서비스 내 고객 관리 시스템과 계좌 관리 시스템이 있다고 하면, 각각의 핵심 관점은 고객 관리와 계좌 관리이겠지만, 부가적으로 로깅이나 db와의 연결 등 공통으로 필요한 기능들이 있다. 이렇게 공통으로 필요한 부가적인 부분을 모듈화해서 관리하고자 하는 것이 AOP이다. 

728x90