Day_34 ( 스프링 - 1 )

HD.Y·2023년 12월 14일
0

한화시스템 BEYOND SW

목록 보기
28/58
post-thumbnail

Servlet(서블릿) 이란❓

  • 서블릿은 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다. 즉, 서블릿은 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.

  • 예를 들어, 사용자가 로그인을 하려고 할 때, 사용자는 아이디와 비밀번호를 입력하고, 로그인 버튼을 누른다. 그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고, 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 것이 바로 서블릿이다.

  • 서블릿의 특징
    ➡ 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
    ➡ HTML을 사용하여 요청에 응답한다.
    ➡ Java Thread를 이용하여 동작한다.
    ➡ MVC 패턴에서 Controller로 이용된다.
    ➡ HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
    ➡ UDP보다 처리 속도가 느리다.
    ➡ HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.

  • 일반적으로 웹서버는 정적인 페이지만을 제공하기 때문에 동적인 페이지를 제공하기 위해서 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 한다.
    ➡ 동적인 페이지 : 사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것

  • 여기서 웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이다.

    서블릿 동작 방식

  1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송한다.

  2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성한다.

  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다.

  4. 해당 서블릿에서 service메소드를 호출한 후 클라이언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출한다.

  5. 위 2개의 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보내고, 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.


DispatcherServlet 이란❓

  • 프론트 컨트롤러(Front Controller) 라고도 불리는 DispatcherServlet은 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아서 적합한 컨트롤러에 위임하는 역할을 한다.

  • Spring MVC는 DispatcherServlet이 등장함에 따라 web.xml 의 역할을 상당히 축소시켜주었다. DispatcherServlet 이 등장하기 전에는 모든 서블릿에 대해 URL을 매핑하기 위해 관련 설정( web.xml에 모두 등록 등 )을 해주어야 하는 번거로움이 존재했다.

  • 하지만 DispatcherServlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리하면서 상당히 편리하게 이용할 수 있게 되었다.
    우리는 컨트롤러를 구현해두기만 하면 DispatcherServlet 이 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었다.

    ✅ DispatcherServlet 동작 방식

    1) DispatcherServlet이 클라이언트의 모든 요청을 받는다.
      ➡ Servlet WebApplicationContext 로 요청이 들어오면 필터들을 지나
        Spring Context에서 DispatcherServlet이 가장 먼저 요청을 받게 된다.

    2) 요청 정보를 통해 HandlerMappinng에 위임하여 처리할 "Controller" 를 찾는다.
      ➡ 가장 먼저 어느 "Controller" 가 요청을 처리할 수 있는지 식별해야 하는데,
        이 역할을 하는 것이 HandlerMapping이다. 이때 주로 사용하는 것이
        @RequestMapping 어노테이션이다.

    3) 2번에서 찾은 "Controller" 로 위임할 HandlerAdapter를 찾는다.
      ➡ 다양하게 작성되는 "Controller" 에 대응하기 위해 스프링은 HandlerAdapter라는
        어댑터 인터페이스를 통해 어댑터 패턴을 적용함으로써 "Controller"의 구현 방식에
        상관없이 요청을 위임할 수 있도록 하였다.

    4) HandlerAdapter는 "Controller" 에 비즈니스 로직 처리를 호출한다.

    5) "Controller" 는 비즈니스 로직을 수행하고, 처리 결과를 반환한다.
      ➡ 응답 데이터를 사용하는 경우에는 주로 ResponseEntity를 반환하고, 응답 페이지를
        보여주는 경우라면 String 으로 View의 이름을 반환하기도 한다.

    6) 5번에서 반환받은 값을 HandlerAdapter가 처리한다.
      ➡ 만약 "Controller" 가 ResponseEntity를 반환하면 HttpEntityMethodProcessor가 
        MessageConverter를 사용해 응답 객체를 직렬화하고 응답 상태(HttpStatus)를
        설정한다.
      ➡ 만약 컨트롤러가 View 이름을 반환하면 ViewResolver를 통해 View를 반환한다.

    7) 최종적으로 서버의 응답을 클라이언트에게 반환한다.
      ➡ 응답이 데이터라면 그대로 반환되고, 응답이 화면이라면 View의 이름에 맞는
        View를 찾아서 반환해주는 ViewResolver가 적절한 화면을 보내준다.


오늘의 학습 내용 정리

  • Spring(스프링) 이란❓
    스프링은 자바 플랫폼을 위한 오픈 소스 어플리케이션 프레임워크이다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고, 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준 프레임워크의 기반 기술로 쓰이고 있다.

  • Framework(프레임워크) 란❓
    개발자들이 생산하는 코드 품질 및 개발 속도를 상향 평준화시키기 위해 고안된 규약이자 표준 개발 방법을 제공해주는 어플리케이션이다.

  • Spring Boot(스프링 부트) 란❓
    스프링 부트는 스프링의 여러가지 프로젝트 중 하나로, 스프링에서는 설정할 내용도 굉장히 많고, XML 파일로 설정해야할 경우가 많은데 이러한 수많은 설정과 복잡함을 최소화하고 개발자의 생산성을 향상 시키기 위해 개발되어졌다.

    스프링부트 프로젝트 구조
    1) src/main/java : 클래스 파일을 모아 둔 곳
    2) src/main/resources : xml, properties를 저장하는 곳
     (1) "static" : css , js , 그림 등의 파일을 저장하는 곳
      (2) "templates" : 타임리프(thymeleaf) 형식 템플릿 파일을 저장하는 곳
        * 스프링 부트에서는 jsp 파일이 아닌 thymeleaf 템플릿 엔진 사용을 권장한다.
      (3) "application.properties" : 스프링 부트 전체 프로젝트의 설정을 저장하는 곳으로
                     이 파일에 설정되어져 있는 정보를 최우선적으로
                     따른다.
    3) src/test/java : JUnit 등 테스트 케이스의 자바 클래스 파일들을 저장하는 곳

  • JNDI(Java Naming and Directory Interface) 란❓
    JNDI는 이름지정 및 디렉토리 서비스에서 제공하는 데이터 및 객체를 참조(lookup)하기 위한 자바 API이다. 일반적으로 자바 어플리케이션을 외부 디렉터리 서비스(EX : DB server)에 연결할 때 쓰이는데 그중에서도 데이터베이스 연결에 가장 많이 쓰인다. 

    데이터베이스 연결 시에는 데이터베이스 커넥션을 미리 만들어서 저장해두고,
    필요할때 저장된 공간 (DB Pool)에서 가져다 쓰고 반환하는 기법으로 설정 파일을 읽어서 해당 내용대로 객체를 생성하는 자바 기술이다.

  • Component Scan(컴포넌트 스캔) 이란❓
    스프링 빈(Bean)을 등록할 때 구성파일에 @Bean 을 사용하는데 관리할 빈이 많아지면 관리하기가 번거로워 진다. 이때, 굳이 빈 설정파일을 만들지 않거나, @Bean을 안쓰고
    빈 등록을 할 수가 있다. 그것이 바로 @Component 와 "Component Scan"을 사용하는 것이다.
    그렇다면 설정파일이 없는데 의존관계는 어떻게 주입할까? 바로 @Autowired를 사용하여 자동 의존관계를 주입할 수 있다.

  • 스프링 프로젝트 시작 후 컴포넌트 스캔과 관련된 어노테이션이 있는 객체들이 실행되는 과정은 아래와 같다.

    1. 프로젝트 시작
    스프링 프로젝트는 일반적으로 웹 어플리케이션 컨텍스트를 구성하는 웹 애플리케이션 컨텍스트 파일(XML 또는 JavaConfig)과 함께 시작된다.

    2. 디스패처 서블릿 실행
    웹 애플리케이션은 일반적으로 web.xml 파일에서 서블릿 매핑을 정의하는데, 여기서 디스패처 서블릿(DispatcherServlet)이 등록되고 해당 서블릿이 초기화된다.
    디스패처 서블릿은 스프링 어플리케이션 컨텍스트를 로드하고, 이 컨텍스트는 스프링 애플리케이션의 핵심 설정 정보를 갖고 있다.

    3. 컴포넌트 스캔
    스프링은 컴포넌트 스캔을 통해 애플리케이션 내의 어노테이션을 가진 클래스를 찾아 빈(Bean)으로 등록한다.
    @ComponentScan 어노테이션을 사용하면, 지정된 패키지에서 @Component 및 그와 관련된 어노테이션을 가진 클래스들을 찾아 스프링 컨테이너에 등록한다.

    4. 컴포넌트 어노테이션 객체 실행
    @Component 어노테이션 뿐만 아니라 @Controller, @Service, @Repository 등과 같은 특정 용도를 가진 어노테이션들도 컴포넌트 스캔의 대상이다.
    이 어노테이션을 가진 클래스들은 스프링이 자동으로 빈으로 등록하고, 이후 해당 빈들은 DI(Dependency Injection)를 통해 의존성 주입을 받을 수 있습니다.

    5. 의존성 주입
    빈으로 등록된 객체들 간의 의존성은 @Autowired 어노테이션을 사용하여 주입된다. 스프링은 컨테이너에서 해당 빈을 찾아 주입하게 된다.

    6. 요청 처리
    클라이언트의 요청이 들어오면, 디스패처 서블릿은 핸들러 매핑과 핸들러 어댑터를 사용하여 요청을 처리할 컨트롤러를 찾는다.
    찾은 컨트롤러는 해당 요청을 처리하고 필요한 비즈니스 로직을 수행한 후, 모델과 뷰 정보를 반환한다.

    7. 뷰 렌더링
    반환된 뷰 정보에 따라 디스패처 서블릿은 적절한 뷰 렌더링을 수행하고, 클라이언트에 응답을 전송한다. 이렇게 스프링은 초기화 단계에서부터 컴포넌트 스캔과 의존성 주입을 통해 애플리케이션을 초기화하고, 클라이언트의 요청에 따라 컨트롤러를 실행하여 동적으로 응답을 생성한다.


💻 스프링 부트 실습해보기

  • 위 처럼 컨트롤러를 작성하고 홈페이지 메인, 로그인, 회원가입, 상품 상세 페이지 등을 구현해 볼 수있다.
    1) 템플릿 사이트에서 원하는 무료 템플릿을 다운로드 받는다.
     ➡ https://themewagon.com/
    2) 다운받은 파일에서 폴더들은 resources-static 폴더에 복사한다.
    3) html 파일은 resources-templates 폴더에 복사한다.

  • 홈페이지 메인을 예로 들때, URL 주소창에 localhost:8080/homepage 를 입력하면 "homepage" 메소드를 찾아가고 그럼 index를 반환하게 되는데 이때 index를 "templates" 패키지에서 동일한 이름이 있는 html 파일을 찾아서 해당 파일을 클라이언트에게 보여준다.

  • @Controller@RestController 의 가장 큰 차이는 @Controller은 리턴값으로 "index"가 있을때 해당 파일과 동일한 이름을 templates 패키지에서 찾아서 반환해준다면, @RestController 은 리턴에 있는 "index" 글자 자체를 반환해준다는 차이가 있다.

    @Controller 사용 시




    @RestController 사용 시


오늘의 느낀점 👀

  • 오늘은 드디어 스프링 수업을 시작하는 날이었다. 스프링 프레임워크 수업은 3주 동안 진행되는 만큼 이번 백엔드 부트캠프 교육 커리큘럼 중 가장 많은 시간을 배운다. 그만큼 백엔드 개발자에게 있어서 스프링은 중요한 내용이라고 생각한다.

  • 먼저 오늘은 스프링에 대해서 학습하였는데, 사실상 스프링 부트가 나오면서 스프링의 불편하고 어려웠던 내용들은 전부 스프링 부트 안으로 들어갔다고 한다. 하지만 개념은 알고 있는게 좋다고 하여 오늘 이것저것 배운 내용을 정리해봤다.

  • 중요한 것은 클라이언트의 요청이 서버에서 어떤 과정을 통해서 처리되어 클라이언트에게 보여지는지 그 과정을 이해하는 것이라 한다.

  • 따라서 스프링 수업 3주동안 나는 이것저것 배우면서 한층 더 성장할것이고, 그러기 위해서 복습을 포함하여 배우지 않은 부분들까지 따로 찾아보면서 열심히 노력할 예정이다.💥💥






    [ 자료 참고 ] : https://mangkyu.tistory.com/14

profile
Backend Developer

0개의 댓글