Spring과 친해지기

Jihu Kim·2024년 1월 13일
0

Spring 입문

목록 보기
2/14
post-thumbnail

많은 회사에서 자바 기반의 애플리케이션을 개발하는 데 스프링과 스프링 부트를 사용하고 있다.

스프링 프레임워크는 자바 기반의 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공한다. 스프링은 목적에 따라 다양한 프로젝트를 제공하는데, 그 중 하나가 스프링 부트이다.

엔터프라이즈급 개발 : 기업 환경을 대상으로 하는 개발, 대규모 데이터를 처리하는 환경

나는 스프링이 제공하는 다양한 프로젝트 중 하나인 스프링 부트를 통해 Backend를 이해하고자 한다.

스프링 부트의 등장 : 스프링 프레임워크에서 필요한 모듈들을 추가하다보면 설정이 복잡해지는 문제를 해결하기 위해 등장


스프링 부트의 동작 방식

MVC 패턴

MVC는 프로젝트를 구성할 때 Model, View, Controller의 역할로 구분하는 패턴이다.

  • Model
    애플리케이션의 정보, 데이터를 나타낸다. 데이터베이스, 처음의 정의하는 상수, 초기화값, 변수 등을 의미한다.
    추가로 이러한 데이터를 파싱하거나 데이터베이스와의 통신 또한 책임지는 컴포넌트(비지니스 로직)이다.
    • 비즈니스 로직: (Service, DTO, Repository(DAO), Domain(entity))
  • View : (Front-end)
    사용자가 보는 화면, 즉 input 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 의미한다. 데이터를 기반으로 사용자들이 볼 수 있는 화면이다.
  • Controller
    Model과 View의 중간다리 역할을 한다.
    즉, 사용자가 데이터를 클릭하고, 수정하는 것에 대한 "이벤트"들을 처리하는 부분을 의미한다.

스프링 부트에서 spring-boot-starter-web 모듈을 사용하면 기본적으로 톰캣을 사용하는 스프링 MVC 구조를 기반으로 동작한다.

  • 스프링 부트는 톰캣이 내장되어있다. (Java 웹 애플리케이션에서 설정을 정의하는 web.xml에 톰캣과 DispatcherServlet이 자동으로 설정된다.)

  • Servlet은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다. (서블릿은 주로 HTTP 요청을 처리하고, 그 결과를 HTTP 응답으로 클라이언트(웹 브라우저)에게 반환하는 역할 수행)

  • 일반적으로 서블릿은 서블릿 컨테이너에서 관리한다. 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행한다.

  • 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 컨테이너이다.

전체적인 요청 흐름

그림1

  1. 클라이언트가 요청을 보냅니다.
  2. 요청은 Servlet Filter를 통과한 후, Servlet Container로 전달됩니다.
  3. Servlet Container는 서블릿을 로드하고, 초기화 후 요청을 DispatcherServlet에 전달합니다.
  4. DispatcherServlet은 요청을 처리할 적절한 Controller를 찾아 전달합니다.
  5. Controller는 비즈니스 로직을 처리하고 결과를 DispatcherServlet을 통해 클라이언트에게 응답합니다.
  • 이 구조는 Spring MVC 패턴을 사용하는 애플리케이션의 전형적인 요청 처리 흐름(Servlet과 Spring MVC가 상호작용해 요청을 처리하는 것)을 나타낸다.

그림2

  1. 클라이언트가 요청을 보냅니다.
  2. Web Server(Apache, Nginx)는 클라이언트로부터 HTTP 요청을 받습니다.
    • 정적 리소스(HTML, CSS, JS, 이미지)는 직접 클라이언트에게 응답.
    • 동적 요청(JSP, Servlet 등)은 WAS로 전달.
  3. Web Server는 요청을 WAS(Tomcat)에 보냅니다.
    • Servlet, JSP 처리가 필요하면 WAS에 넘김.
  4. WAS는 요청을 처리할 Servlet을 찾습니다.
  5. WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성합니다.
  6. HttpServletRequest와 HttpServletResponse 객체를 생성해 Servlet에 전달합니다.
  7. Servlet이 요청을 처리하고, 응답을 Response 객체에 담아 WAS에 전달합니다.
  8. WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달합니다.
  9. Web Server가 클라이언트에게 응답을 반환합니다.
  10. WAS는 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거합니다.
    • Thread는 재사용(Pooling)되는 경우가 많음.
  • 한줄 요약 : [클라이언트 요청] → [웹 서버](정적 요청: 바로 응답) → [WAS] → [Servlet] → [DB 조회] → [응답 생성] → [클라이언트 응답]
    • 웹 서버와 WAS를 분리하는 이유 : 성능 향상(웹 서버는 정적 요청 처리, WAS는 동적 요청 처리하도록), 보안 강화(클라이언트가 직접 WAS에 접근하지 못하도록), 트래픽 분산(여러 WAS를 구성해 트래픽 분산)
      • 웹 서버(Apache, Nginx) → 정적 파일(HTML, CSS, JS) 제공, 동적 요청은 WAS로 전달
      • WAS(Tomcat, WebLogic 등) → Servlet 실행(동적 요청 처리), 비즈니스 로직 처리

Spring MVC

MVC가 조금 더 포괄적이 개념이라 생각한다.
고로 MVC안에 Spring web Layer를 넣어보면

  • Model : Service, DTO, Repository(DAO), Domain(entity)
  • View : Front-end
  • Controller : Controller

Controller, Repository, Service = 정형화 되어있는 패턴이다

  • Controller를 통해서 외부요청을 받고,
  • Service를 통해서 비즈니스 로직을 만들고,
  • Repository에서 데이터를 저장하고
  • controller : 적절한 Response Entity를 Body에 담아 Client에 전달

  • service : DAO로 DB에 접근하고 DTO로 데이터를 받은 후, 비즈니스 로직을 처리해 적절한 데이터 반환

  • entity : 실제 DB의 테이블과 매칭될 클래스

  • DTO : 계층간 데이터 교환을 위한 객체

  • repository : ..

  • DAO(Repository) : 데이터베이스에 접근하기 위한 로직을 관리하는 객체(Service와 DB를 연결)


패키지 구성 방법

실제 프로젝트 작업시 패키지 구성 방법으로는 크게 두가지 방법이 있다.

  • 레이어드형 아키텍처
  • 도메인형 아키텍처

레이어드형 아키텍처

도메인형 아키텍처

인프라 레이어의 추가 여부로 달라질 수 있다.

  • 뇌피셜:
    MSA를 적용해 애플리케이션 하나에 여러 기능을 개발하지 않고 기능별로 나누어 개발하는 방식을 많은 기업이 채택하고 있다는 생각을 한다.
    따라서 레이어드형 아키텍처로 구조를 설계하고, 학습을 진행하는 것이 좋겠다.

추가적으로 MSA를 통해 기능별로 나누어서 개발을 한다면 서버간 통신이 필요한 경우가 발생할 것이다. 이 때 보통 HTTP/HTTPS 방식으로 통신을 한다.

스프링의 영역은 방대하기 때문에 모두 알 수 없다. 개발을 진행하며 필요한 정보는 sprin.io -> project -> spring boot -> learn -> reference doc -> springboot 에서 찾고자하는 정보를 찾을 수 있어야한다.


Model, View, Controller 각각 구현해보고 이해하기

정적 컨텐츠를 보내주는 방식

  • 정적파일을 그대로 넘겨주는 방식도 있다.

뷰를 사용하는 동작방식

  • 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버가 화면을 찾아서 처리한다.

@RestController를 사용하는 동작방식

  • 주로 사용되는 방식
  • @ResponseBody를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않음. (JSON 형식으로 변환해서 응답)
  • HTTP의 BODY에 문자내용을 직접 반환
  • API 만들 때 사용하는 방식

뷰 리졸버를 호출하지 않고 MessageConvert를 거쳐 JSON형식으로 변환해서 응답


스프링 빈과 의존관계

  • 스프링 빈을 등록하는 방법
    1. 컴포넌트 스캔과 자동 의존관계 설정
    2. 자바코드로 직접 스프링 빈 등록하기

컴포넌트 스캔을 통해 스프링 빈 등록

controller를 통해서 html을 뿌려줄 예정, controller는 service에서 데이터를 받아오도록 함(의존관계에 있다.)

@Controller를 하면, 객체를 생성해서 스프링이 갖고있다 -> 스프링 컨테이너가 생기고, ... bean이 갖고있다고 한다.

controller 어노테이션 후에는 객체를 new를 통해서 생성하지 않도록 한다. -> 스프링 컨테이너에 등록한 후 사용하도록 한다.

스프링 컨테이너에 등록하는 방법 = @Service, @Repository => @Component로 하면 된다.

=> 스프링부트의 메인 어플리케이션 코드는 @SpringBootApplication 어노테이션을 갖고있다. @SpringAnnotation은 @SpringBootConfiguration @EnableAutoConfiguration @Component 어노테이션은 합쳐놓은 구성이다.

스프링부트 애플리케이션이 실행되면 @Component 어노테이션이 시리즈 어노테이션(@Controller @RestController @Service @Repository @Configuration)이 붙은 클래스를 발견해 빈을 등록한다.

스프링 부트의 각 웹 애플리케이션에는 내장 WAS가 존재한다. (Tomcat)

자바코드로 직접 스프링 빈 등록하기

@Bean

Controller는 @Autowired로 등록하도록 한다. (구조에 따라 다름)

상황에 따라 구현 클래스를 변경해야 하므로 직접 스프링 빈으로 등록하는 방법을 알아야만 한다.

테스트 코드 작성하기

Junit

Assertions를 통해서 검증해볼 수 있다.

테스트 하나 끝내고나면 데이터를 clear를 해주어야한다.

테스트할 때 given, when, then의 패턴으로 시작을 하자.

스프링 부트 프로젝트 생성하기

https://start.spring.io/ 를 통해서 스프링 부트 프로젝트 생성

  1. Gradle, Maven은 필요한 라이브러리를 땡겨서 오고. 빌드하는 라이브러리 사이클까지 관리하는 툴
  1. Dependencies에서 필요한 라이브러리를 땡겨올 수 있음.
    Spring Web - Web프로젝트 시
    Thymeleaf - html을 만들어주는 템플릿엔진
  1. 그 후 Generate하면 스프링부트 프로젝트가 다운로드가 되며, zip파일을 압축해제 후 진행하면 된다.

초기 프로젝트 생성 시 구조

메인 = SpringApplication

빨간폴더 - intelliJ가 사용하는 설정파일

gradle - 빌드도구와 관련된

src - maintest

resources - html 또는 실제 자바파일이 아닌 설정파일 등

build.gradle - 라이브러리, 설정파일 등

.
.

의존(dependency에 의해 연결 됨) spring-core까지 ..

external libralies - 실제 모든 라이브러리

Spring 핵심 라이브러리에 대해서 알고있기


앞으로 공부할 내용

  • 스프링 부트 애플리케이션 개발하기

  • API 만들기

    • 프로젝트 설정
    • DTO 객체 활용
    • GET API
    • POST API
    • PUT API
    • DELETE API
    • API 명세서
    • Logback
  • 데이터베이스 연동

    • 마리아DB
    • ORM
    • JPA
    • 하이버네이트(SPRING DATA JPA)
    • 영속성 컨텍스트(엔티티 매니저)
    • 데이터베이스 연동
    • 엔티티 설계
    • 리포지토리 인터페이스 설계
    • DAO 설계
  • 테스트 코드 작성

  • Spring Data JPA 활용

  • 연관관계 매핑

  • 유효성 검사와 예외 처리

  • 엑추에이터 활용

  • 서버 간 통신

  • 서비스의 인증과 권한 부여


백엔드 개발자의 필수 역량

CRUD

JWT

Swagger(Postman)

ERD(DB설계)

Docker

AWS(EC2, RDS)

Frontend


IntelliJ 유용한 단축키

ctrl + p = 필요한 파라미터를 볼 수 있음
ctrl + shift + enter = 자동완성
alt + shift + enter = 인터페이스 implements 후 오버라이드
ctrl + alt + v = return으로 바꿔줌
ctrl + alt + m = 메소드로 뽑아내기
ctrl + alt + b = 해당 클래스로 이동
sout = System.out.println으로
shift + f6 = 변수이름 리네임
ctrl + alt + l = 코드정렬
ctrl + shift + t = 테스트하고자하는 클래스를 바로 테스트파일로 만들어줌
alt + shift + enter = 생성자 매개변수 추가
alt + F7 = 클래스가 사용된 모든 곳을 확인할 수 있음

profile
Jihukimme

0개의 댓글