Spring Boot 구조 정리

웃음인·2024년 11월 13일

Framework

목록 보기
6/7
post-thumbnail


🏷️DTO (Data Transfer Object)

계층 간(Controlelr, View, Business Layer) 데이터 교환을 위해 사용하는 객체이며
로직을 가지지 않는 데이터 객체이다
클라이언트 요청에 포함된 데이터를 담아 서버 측에 전달하고,
서버 측의 응답 데이터를 담아 클라이언트에 전달
하는 계층간 전달자 역할을 한다

DTO를 사용하게 된다면 Model을 캡슐화 하고, 사용하는 데이터만 선택적으로 보낼 수 있게된다. 따라서 DTO는 클라이언트 요청에 포함된 데이터를 담아 서버 측에 전달을 하고, 서버 측은 응답 데이터를 DTO에 담아 클라이언트에게 전달하는 전달자 역할을 한다.

‣ DTO 단에서 사용되는 어노테이션

@Data (Getter + Setter + ToString)  /  @Getter, @Setter, @ToString
@NoArgsConstructor : 기본생성자 [ ex) public Student() {}  ]
@AllArgsConstructor  : 모든 필드 초기화용 매개변수생성자


🏷️Controller

클라이언트로부터 요청을 받고
해당 요청에 대해 서비스 단에 구현된 적절한 메소드를 호출해서 결과값을 받는다

즉, 클라이언트로부터 들어오는 HTTP 요청을 받아서
Service단에 처리를 위임하고 이에 대한 결과를 View를 통해 반환하는 역할
(뷰에 전달할 결과 데이터를 조회해 모델에 담는다)

속성설명
ModelView에 출력할 데이터를 담아둔다
View모델에 담긴 데이터를 사용해 화면을 그린다(HTML생성)

쉽게 말하면 컨트롤러는 요청에 따라 어떤 처리를 할지 결정만 해주고
실질적인 처리는 서비스 단에서 담당
한다 !!

Controller 메서드의 반환형이 String 인 이유는 ?
- 메서드에서 반환되는 문자열이 forward 할 html 파일의 경로가 되기 때문이다!

‣ MVC 패턴에 포함되어있음

MVC(Model View Controller) : JSP가 처리하던 것을 컨트롤러와 뷰 영역으로 나눈 것

본래 Controller 영역에 View 영역을 같이 구현하여 사용자 요청을 JSP에서 전부 처리했는데, 이렇게 되면 JSP파일 비중이 커지고 유지보수와 확장이 어려워지기 때문에 이러한 문제점을 해결하고자 MVC 패턴이 등장


🏷️Service

Controller와 Repository를 잇는 역할
Service가 없다면 Controller에서 직접 데이터를 받아 가공하고 처리하여 View에 넘겨주어야 하는데, 이 과정에서 Controller에는 코드가 길어지고, 중복되는 코드가 많아질 것이다.
그 중복되는 비지니스 로직(데이터 가공, 처리)을 모듈화한 것이Service다

  1. Client가 Request를 보낸다.(Ajax, fetch등..)
  2. Request URL에 알맞은 Controller가 수신 받는다. (@Controller)
  3. Controller 는 넘어온 요청을 처리하기 위해 Service 를 호출한다.
  4. Service는 알맞은 정보를 가공하여 Controller에게 데이터를 넘긴다.
  5. Controller 는 Service 의 결과물을 Client 에게 전달해준다.
  6. Service가 알맞은 정보를 가공하는 과정을 '비즈니스 로직을 수행한다.' 라고 한다
  7. Service가 비즈니스 로직을 수행하고 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아온다

🏷️DAO (Data Access Object)

DB의 데이터에 접근하기 위한 객체
DB에 접근하기 위한 로직을 분리하기 위해 사용한다
직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다


🏷️ application.properties

오라클 DB와 연결 하는 객체 설정을 하는 공간

spring.application.name=boardProject-boot

# port 번호를 80으로 변경(80은 HTTP의 기본 포트번호로, 브라우저에서 포트번호 없이 접속 가능)
server.port=80

# Spring DevTools (자동 리로드, 서버 재시작) 설정
# 브라우저 자동 새로고침 기능
spring.devtools.livereload.enabled=true

# 코드 변경 시 서버 자동 재시작
spring.devtools.restart.enabled=true

# 타임리프 캐시 비활성화 (HTML 파일 수정 시 바로 변경사항 확인할 수 있도록)
spring.thymeleaf.cache=false

# 로그 레벨 지정
logging.level.edu.kh.project=debug
			# 현재 패키지 이름
			
#URL에 jsessionid 가 보여질 때 설정
server.servlet.session.tracking-modes=cookie

✍🏼 Controller, Service, Repository 역할 쉽게 알아보기

프리젠테이션 계층 - Controller - 웨이터
손님(클라이언트)이 웨이터(Controller)에게 스테이크를 주문(Request)합니다.
웨이터는 손님의 주문을 받아 주방장(Service)에게 전달하고, 스테이크를 준비해달라고 요청합니다.
주방장이 스테이크를 완성하면, 웨이터는 그것을 손님에게 전달(Response, 스테이크, View/REST API)하는 것처럼, controller는 클라이언트의 요구사항을 이해하고 요청을 service에게 전달합니다.

비즈니스 계층 - Service - 주방장
주방장(Service)은 웨이터로부터 스테이크 주문을 받습니다.
주방장은 스테이크를 만들기 위해 필요한 재료를 재료 담당 알바생(Repository)에게 요청합니다.
재료를 받은 주방장은 자신만의 레시피(비즈니스 로직)에 따라 스테이크를 조리합니다.
완성된 스테이크는 웨이터에게 전달되어 손님에게 제공됩니다.
주방장(service)은 웨이터와 재료 담당 알바생 사이에서 중심적인 역할, 즉 데이터를 가공하는 등 비즈니스 로직을 수행하고 이를 다시 컨트롤러에게 반환하는 역할을 수행합니다.

퍼시스턴스 계층 - Repository - 재료 담당 알바생
재료 담당 알바생(Repository)은 냉장고(데이터베이스)에서 스테이크용 고기를 주방장에게 가져다 줍니다.
repository는 서비스가 비즈니스 로직을 수행할 때 필요한 데이터를 생성, 수정, 조회 등을 처리하여 실제로 데이터베이스에 데이터를 저장, 수정, 조회하는 역할을 수행합니다.


🏷️DB

데이터를 저장하기 위한 곳

SQL(Structured Query Language, 구조적 질의 언어)
: 데이터베이스와 상호작용을 하기 위해 사용하는 표준 언어

‣ 디비버 이용법
-- 선택한 SQL 수행 : 구문에 커서 두고 ctrl + enter
-- 전체 SQL 수행 : ctrl + a (전체 선택) 누르고 alt + x


🏷️Mapper

데이터베이스와 애플리케이션 간의 상호작용을 처리하는 객체
주로 SQL 쿼리를 사용하여 DB에서 데이터를 가져오거나 데이터를 DB에 저장하는 데 사용

Mapper는 객체와 데이터베이스 간의 매핑을 처리하는 역할로써
객체와 DB 테이블 사이의 변환을 담당하여 객체와 테이블 간의 속성 매핑을 수행
한다

mapper는 OOO.xml과 같이 sql문을 정의해놓은 파일과 많이 사용한다.
SQL문을 정의하고 그 결과를 정의해놓은 모델에 매핑시키는 Mybatis방식에서 사용하는 것으로
mapper는 매핑이라는 단어에서 유추할 수 있듯이 sql문(xml)을 메소드(java)로 매핑 시켜주는 것을 의미한다

즉, 우리가 정의해놓은 sql와 개발할 때 사용하는 메소드를 연결하고
결과 값을 정의해놓은 타입으로 매핑 시켜주는 것이다

그래서 우리는 sql문을 정의해놓고 namespace와 sql id에 맞는 메소드를 호출해
DB의 데이터를 조회 및 조작할 수 있는 것이다


🏷️Config

config는 설정이라는 의미로, 소프트웨어나 시스템이 동작하는 방식을 정의하는 매개변수들의 집합이다
흔히 json 형태로 많이 사용되며, 그 외에 .xml, .js, .config 등의 형태로도 사용할 수 있다
이는 개발, 테스팅, 프로덕션 등 다양한 환경에서 애플리케이션이 올바르게 동작하도록 구성하는데 사용된다

🏷️mapper.xml

SQL 구문 모아두는 xml 파일
인터페이스 안에 메서드명과xml 파일 아이디명이 일치하는 sql 문 수행됨 !!!!!!!

Mapper 인터페이스 경로 작성(namespace 필수로 작성)
namespace 없으면 Mapper's namespace cannot be empty 에러 뜸
작성할 때 패키지 경로를 포함한 전체 이름으로 작성

<cache-ref namespace=""/>
위 태그는 mapper.xml 파일 생성하자마자 삭제하기 !! (에러 발생시킴)

<!-- 태그로 SQL 구문 작성 -->
  
<select id="testTitle" resultType="string"> <!-- MyBatis 타입으로 작성 (소문자 s) -->
  	SELECT TODO_TITLE FROM TB_TODO
  	WHERE TODO_NO = 1
</select> 

<select> 태그 속성

  • id 속성: 태그를 식별하는 값 (연결된 Mapper의 메서드명과 동일하게 작성하여 연결)
  • resultType : 조회 결과 한 줄(1행)을 저장하여 반환할 변수/객체 자료형 지정
                    조회 결과가 여러 행이면 행 별로 변수/객체 자료형으로 저장 후 모아서
                    List로 반환 (필드명 == 컬럼명 : 조회 결과가 자동으로 객체의 필드에 세팅)

mapper.xml 에서의 resultMap 태그

  • 1) 조회된 컬럼명과 DTO의 필드명이 일치하지 않을 때 매핑(연결) 시켜주는 역할
  • 2) 태그를 추가 작성하여 여러 행 결과가 조회되는 다른 SELECT를 수행한 후 그 결과를 지정된 DTO의 필드에 대입

type 속성 : 연결할 DTO 경로 또는 별칭

id 속성 : 해당 태그를 식별할 값(이름)


🏷️ Interceptor

요청/응답/뷰 완성 후 가로채는 객체 (Spring 지원)로
전처리(preHandle)와 후처리(postHandle), 뷰 완성 후 처리가 있다

사용할 때 HandlerInterceptor 인터페이스를 상속받아서 구현해야 한다

– preHandle (전처리) : Dispatcher Servlet -> Controller 사이 수행
  (모든 요청 값 Controller 가기 전 가로챔)

– postHandle (후처리) : Controller -> Dispatcher Servlet 사이 수행
  (응답 값 Controller 가기 전 가로챔)

– afterCompletion (뷰 완성(forward 코드 해석) 후)
  : View Resolver -> Dispatcher Servlet 사이 수행 (뷰 완성 후 가로챔)


0개의 댓글