Spring

[Spring] 기본 디렉토리 구조(Controller, Repository, Model, Service)

머직타드 2022. 3. 24. 02:02

Spring은 자바 기반의 객체지향으로 프로그래밍 해야 하는 프레임워크입니다. 그럼 실제 개발할때 구조가 어떻게 되며, 어떤 패턴을 갖게 되는 걸까요?

 

1. Layered Architecture

n-계층 아키텍쳐라고도 하며, 여러 레이어들이 각자 분리되어진 아키텍처를 말합니다. 여기서 레이어는 공통 단위로 묶어진 소프트웨어 단위로, 크게 Presentation / Service / Persistence 로 구성됩니다.

1) Presentation layer(View, Controller, Pages, Display beans)

사용자와의 최종 접점으로, 사용자로부터 데이터를 입력받거나 반대로 데이터를 가공해 처리 결과를 출력해서 보여주는 레이어 입니다.

 

2) Service layer(Services, Mapper between JPA entities and Display beans)

비즈니스 로직이라고도 부르며 핵심 업무의 로직을 구현하는 레이어 입니다. 프레젠테이션 레이어가 Client의 요청을 받아오면 서비스 레이어에서는 실제 그 요청에 대한 처리를 담당합니다.

3) Persistence layer(JPA DAOs Repositories, JPA entities)

데이터베이스와 연결되어 데이터 처리를 주로 담당하는 레이어 입니다. 연동된 DB에 접근하여 데이터를 처리(생성/수정/삭제/선택)하는 CRUD 연산을 수행합니다.

 

장점

- 구조가 간단해 배우고 구현하기에 쉽습니다.

- 각 계층별로 기능이 분리되어 있기 때문에 종속성이 줄어듭니다.

- 구성 요서가 분리되어 있기 때문에 개별적으로 테스트를 수행할 수 있습니다.

단점

- 한 계층 내에서 잘못된 수정으로 인해 전체 시스템에 영향을 줄 수 있습니다.

- 각 계층간에 데이터를 주고 받는 관계이기에 데이터에 있어 의존성이 발생할 수 있습니다.

- 병렬 처리가 불가능합니다.

 

2. Spring에서의 구조

인터넷 강의 서비스(lmsservice) 프로젝트에서의 예시를 들면, "member"디렉토리 내에 controller, entity, model, repository, service 디렉토리가 또 들어있습니다.

 

 

1) Model

DAO(Data Access Object) 역할을 수행하며 Controller에서 생성한 데이터를 담아 View로 전달할 때 사용합니다. HashMap 형태를 갖고 있고 키(key) - 값(value)을 저장합니다. servlet의 request.setAttribute()와 비슷한 역할을 합니다.

MemberController에 있는 registerSubmit()에서 데이터베이스에 회원정보를 등록한 결과를 View에 전달하기 위해 model에 addAttribute()를 사용하여 담아 주고 있습니다.

 

2) Controller

사용자로부터 전달받은 요청을 처리한 후 지정된 View에 모델 객체를 넘겨줍니다.

LMS 프로젝트에서 member는 회원들에 대해 관리해주는 기능입니다. 여기서 "/member/register" 경로에 대해 Get, Post 방식별로 처리할 함수들을 매핑하도록 설정되어 있습니다.

registerSubmit 함수를 보면, 사용자가 입력한 정보(ID, 이름, 전화번호, 패스워드 등)를 memberService 객체가 등록하도록 처리하고 그 결과를 "member/register_complete"라는 View로 리턴해주도록 되어 있습니다.

@RequiredArgsConstructor: 자동으로 생성자를 정의해 줍니다.

 

 

3) Service

사용자로부터 전달받은 데이터를 가공하여 처리해 줍니다. JpaRepository를 상속하는 객체를 가져와 어떤 처리를 할지 비즈니스 로직을 처리합니다.

위 MemberController에서 가져온 데이터를 어떻게 처리할지에 대해 인터페이스로 정의 해놓았습니다.

실제 정의되었던 인터페이스(위에서 MemberService)를 받아 어떤 작업을 처리할지 상세 구현되어있는 MemberServiceImpl 입니다. JPA인 memberRepository를 활용해 사용자가 입력한 정보(ID, 이름, 전화번호, 패스워드, 등록 시간)를 연동되어 있는 DB에 Update하는 내용입니다. 이렇게 사용자가 입력한 정보가 회원 정보로 등록되게 됩니다.

 

 

4) Repository

자바에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 JPA를 담당하는 '저장소' 입니다. 데이터베이스에 CRUD 명령을 실행할 수 있도록 정의되어진 인터페이스 입니다. JPA를 활용하여 복잡한 쿼리 없이 메소드를 통해 데이터베이스에 원하는 쿼리를 수행해 줍니다.

MemberRepository가 JpaRepository<Entity, 기본키 타입>을 상속받음으로써 JpaRepository에 정의되어 있는 CRUD를 수행할 수 있습니다.

 

 

5) Entity

연동되어 있는 데이터베이스에 표현할 추상적인 표현들인 속성(Attribute)가 정의되어 있습니다.

LMS 프로젝트에서 회원가입에 사용되는 5가지 속성이 정의되어 있습니다.

@Data: Lombk 라이브러리로 getter/setter를 구현할 필요 없이 자동 정의해주는 플로그인 입니다.

이 설정으로 DB에 연동되어 작업하게 되면, Entity에 정의되어 있는 속성별로 데이터가 추가됩니다.