본문 바로가기

2024-겨울 프로젝트 관련 공부

[Spring Boot] [기본 개념] MVC, DI 공부

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) --> (사용자)

 

 

2. 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;
    }
}

 

728x90