스프링부트 배운 내용들 정리

열공이·2022년 7월 4일
0

Spring Boot 배운 내용들 정리

https://www.coreycleary.me/what-is-the-difference-between-controllers-and-services-in-node-rest-apis/

구글에 스프링부트 Controller와 Service의 차이를 몇 번이고 검색해봐도 쉽게 알만한 설명이 없었는데 위 사이트 (Node.js로 설명한 곳에서) Controller와 Service에 대해 좀 더 알 수 있었다.

아니, 도대체 왜 제대로 된 설명이 없는 건지...

내가 헷갈렸던 부분:
1) 강의랑 여타 많은 다른 사이트/블로그들에서 Controller가 자동응답기이고, Service가 비즈니스 로직을 수행하는 곳이라는데 CRUD 로직 대부분을 Controller에선 구현한 예시들이 많았다.

스파르타 스프링부트 기본편 강의 내용을 예를 들자면, create, get(read), delete는 controller에서 구현되고, update만 service에서 구현되는 식이었다.

어쩔 수 없이 구글링해서 찾아보면 내가 못 찾는 건지, 키워드를 잘 못 입력한 건지, Service 로직을 제대로 보여준 곳이 없었다. 나랑 비슷한 고민을 하신 분이 있던데, 안타깝게도 그분의 코드는 처음 스프링 배우는 내가 이해하기에는 힘든 예시였다.
https://choibulldog.tistory.com/52

2) Spring MVC 패턴에 대한 얘기가 많아서 찾아보는데 정의만 많지, 각각 어떤 코드로 어떻게 이어지는지 보이지가 않았다. 내가 배울 Spring Boot랑 어떤 연관성인지, 그냥 항해 사람들에게 물어보면 기본이라서 그 정도는 다 스스로 알아야한다는 얘기만 많아서 궁금증을 해결 못 한채 3주를 보냈다.

백엔드에서 쓰이는 건데 어떤식으로 View가 보여지는지 이해가 안 됐다. Json 형태로 데이터가 보내지는 건 알고 있었지만 그걸 어떤 것이 설정하는지 몰랐다. 그래서 계속 MVC가 어떻게 동작하는지, 어떤 코드인지 이해 못 하고 머리 싸매다가, 나중에 View는 Thymeleaf라고 하는 view template (뷰 템플릿)을 build.gradle dependency에 추가해 사용하면 보여줄 수 있다는 걸 알게되었다. 너무 간단해서 3주를 허비한게 허무했는데, 이 경험을 토대로 스프링부트 기본구성을 아는게 얼마나 중요한지 깨달았다. 또, 프로젝트를 준비 할 때 굳이 이론을 (예. Spring MVC) 알 필요가 없었구나 라는 걸 깨달았다. 이론이 탄탄해졌을 뿐, 실전 프로젝트 때 쓸 스프링부트를 활용하고 공부할 시간을 허비했다는 걸 알았다.

MVC

모델 (Model): 비즈니스 규칙을 표현
뷰 (View): 프레젠테이션을 표현
컨트롤러 (Controller): 위 두가지를 분리하기 위하여 양측 사이에 배치된 인터페이스


흐름이 안 잡혀서 스프링 프레임워크에 대해서 보다보니 Dispatcher Servlet, Handler Mapping 등 못 본 용어/개념들이 있어서 어떻게 써먹어야할지 헷갈렸다. 그런데 아주 쉽게 정리된 사이트가 있었다.

https://velog.io/@hellonayeon/springmvc-vs-springboot
Spring MVC · Spring Boot 차이
Spring MVC 와 Spring Boot 의 가장 큰 차이는 설정의 자동화 라고 생각한다. Spring MVC 구조의 경우 XML 파일들에 Dispatcher Servlet Handler Mapping View Resolver 설정들을 해줘야한다. 수업을 들으면서도 각종 XML 파일들에 설정을 하고 그 설정들을 이해하는게 가장 어려운 부분이었다. 하지만 Spring Boot 의 경우 @ 만 적절하게 명시해주면 Spring 이 알아서 다 처리해준다!
뿐만아니라 이 둘은 WAS 내장 여부 차이도 있다. Servlet 기반의 프로그램을 실행하기 위해서는 WAS 가 필요한데, Spring MVC 프로젝트의 경우 따로 Tomcat 과 같은 WAS 서버를 설치해줘야 한다. 반면 Spring Boot 에는 Tomcat 이 내장되있어 별도의 웹 애플리케이션 설치가 필요없다.
앞서 언급했듯 Spring MVC 와 Spring Boot 모두 Spring 기반의 프레임워크다. 실제로 IntelliJ IDEA 에서 Spring Boot 프로젝트를 설정할때 초기 의존성을 설정하는 부분에서 Spring Web 을 추가해주는데, 이 과정은 Spring MVC 기반의 프로젝트를 생성함을 의미한다. 결론적으로 나는 현재 Spring MVC 구조의 프로젝트를 진행하고 있으며, 설정의 자동화를 위해 Spring Boot 프레임워크를 사용하고 있다.

이걸 읽으니 왜 항해에서 스프링부트로 웹개발을 하게끔 했는지 명확해졌다. 정확하게 알지는 못하더래도 Spring Boot를 배울 때 Dispatcher Servlet, Handler Mapping, View Resolver를 굳이 안 배워도 된다니 시간을 아낄 수 있을 것 같다. 이것들 때문에 머리 아팠는데 잘 됐다.


Controller

사용자의 요청을 처리 한 후 지정된 뷰에 모델 객체를 넘겨주는 역할

Controller 관련 대표 Annotation들

  1. @Controller:
  • 해당 클래스를 Controller로 사용한다고 Spring FrameWork에 알림.
  • 필요한 비즈니스 로직을 호출하여 전달할 모델(Model)과 이동할 뷰(View) 정보를 DispatherServlet에 반환.
  • Bean으로 등록
  • @Component의 구체화 된 어노테이션 (Stereotype annotation)
  1. RequestMapping

  2. Parameter관련
    @RequestParam: 사용자가 원하는 매개변수에 값을 매핑하기위해 사용
    @PathVariable: url 경로를 변수화하여 사용할 수 있게 해줌

  3. @ResponseBody

  • 객체 정보 전달을 위해 view가 아닌 data를 반환할 때 사용됨
  • String, Map, JSON 등을 전달할 수 있음
  • @RestController
  • @ResponseBody와 @Controller를 합친 것
  • JSON형식으로 data전달

View

사용자가 보는 화면; Controller가 사용자에게 보내주는 것
View를 만들 수 있는 것: html, JSP, 그리고 템플릿엔진이 있음

템플릿엔진: 동적 컨텐츠를 생성하는 방법

스프링 부트가 자동 설정을 지원하는 4가지 템플릿 엔진

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Mustache
  1. 비즈니스 요구사항 정리
  • 데이터 : 회원ID(자동생성), 이름

  • 기능 : 회원 등록, 조회

  • 아직 데이터 저장소가 선정되지 않음

  1. 기본 웹 어플리케이션 계층 구조
  • Controller : 웹 MVC의 컨트롤러 역할

  • Service : 핵심 비즈니스 로직 구현

  • Repository : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

  • Domain : 비즈니스 도메인 객체, ex) 회원,주문,쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

Controller -> Service -> Repository -> DB

                  |

                  V

               Domain

(4개의 정확한 역할에 대한 느낌이 와닿지 않는다. 아래의 예제를 통해 느낌을 확실히 해보자)

Controller, Service, Repository

Controller
클라이언트의 요청을 받음
요청에 대한 처리는 서비스에게 전담
클라이언트에게 응답
Service
사용자의 요구사항 처리
DB 정보가 필요할 때는 Repository에게 전담
Repository
DB 관리(연결, 해제, 자원 관리)
DB CRUD 작업 처리

https://blog.naver.com/PostView.nhn?blogId=good_ray&logNo=222267722516

DI란?

DI란?
의존성 주입.
하나의 객체에서 다른 객체가 필요할 때 객체를 직접 생성하지 않고 이미 생성되어 있는 객체를 가져오는 작업을 DI(Dependency Injection), 의존성 주입이라고 한다.

🎈 장점
단위 테스트가 용이해진다.
코드의 재활용성을 높여준다.
객체 간의 의존성을 줄이거나 없앨 수 있다.
객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.
🎈 정리
한 클래스를 수정하였을 때 다른 클래스도 수정해야하는 상황을 막을 수 있다.

의존성 주입은 필요한 객체를 직접 생성하는 것이 아니라 외부로부터 필요한 객체를 받아서 사용하는 것이다.

IoC란?

제어의 역전.
스프링 컨테이너가 필요에 따라 개발자 대신 bean들을 관리(제어)해주는 행위.
객체에 대한 제어권이 컨테이너로 역전되었다.
사용자가 자신이 필요한 객체를 생성해서 사용하는 것이 일반적이지만,
필요한 객체를 요청하면 어디서 어떻게 만들어졌는지 알 필요 없는 객체가 사용자에게 주어진다.
그러면 사용할 객체의 생성자가 바뀌더라도 사용자 입장에서는 알 수 없고 알 필요도 없다.

🎈 스프링 IoC 컨테이너 사용하기
빈(bean) : 스프링이 생성해주는 객체
스프링IoC 컨테이너 : 빈을 모아둔 통
어노테이션을 통해 스프링의 빈으로 등록된다.

Thymeleaf

https://dev-overload.tistory.com/25

Lombok(롬복)이란?

롬복의 기능은 바로 내부적으로 DTO와 같은 모델에서 변수를 지정하면 자바 클래스로 만들 때 setter, getter, toString 등의 메소드를 자동으로 만들어주는 기능이다.

롬복 설치 롬복을 사용하기 위해서는 메이븐(Maven)이나 그레이들(Gradle)에서 단순히 사용하겠다 설정만 하는 것이 아니라 통합개발환경(Integrated Development Environment, IDE) 툴에 플러그인(Plugin)을 설치해야 한다.

--> 나는 맥에서 IntelliJ 쓰니까 Cmd + , 눌러서 환경설정에 들어가 Plugins 찾아들어가 Lombok 검색해서 설치했다.

ORM이란?

  • Object-Relational Mapping (객체와 관계형데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것) - 객체가 테이블이 되도록 매핑 시켜주는 프레임워크 이다.  - 프로그램의 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있는 방법  - SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있다. ex) 기존쿼리 : SELECT * FROM MEMBER; 이를 ORM을 사용하면 Member테이블과 매핑된 객체가 member라고 할 때, member.findAll()이라는 메서드 호출로 데이터 조회가 가능하다.

Annotation 분류

Lombok
@NoArgsConstructor
@RequiredArgsConstructor: 초기화 되지 않은 final 필드와 @NonNull 어노테이션이 붙은 필드에 대한 생성자 생성@AllArgsConstructor: 모든 필드에 대한 생성자 생성
@Setter
@Getter

Persistence

Stereotype
@Controller
@Service
@Repository

web.bind.annotation
@RestController


Spring Boot에 필요한 Java내용 정리

https://myjamong.tistory.com/150

추상 클래스 (Abstract Class) vs. 인터페이스 (Interface)

참고

MVC

Controller, Service, Repository 고민

DI, IoC

Lombok

JPA

Bean & Component

Security

Java

전체:

profile
프로그래머가 되자! 열공!

0개의 댓글