•
회의 날짜: 2022/02/06 (월)
•
회의 장소: discord 라운지
•
참석자: 김솔배, 구연지, 안지영, 김재근
[회고 사진]
[이번 스터디 공부한 내용
스프링 MVC 정리
김솔배
스프링에서 어떻게 요청이 와서 응답을 하는지 전체적으로 알 수 있는 시간이였습니다.
서블릿 → JSP → MVC 를 거쳐가면서 왜 지금 MVC패턴을 사용하는지 알아보았는데
확실히 MVC패턴을 사용하니 개발에만 집중할 수 있었습니다.
스프링 MVC의 디스패쳐 서블릿이 어떤기능을 하고 왜 필요한지 더 잘 알게되었습니다.
추가적으로 Http요청과 응답이 어떻게 오고 가는지 알아보았습니다.
서블릿을 공부하면서 헤더를 받고, 응답하는 과정이 있었는데 그 과정을 통해 프로젝트 하는데 있어서 많은 도움이 되었던것 같습니다.
메시지 컨버터를 사용해서 요청과 응답을 받는 과정도 공부할 수 있어서 좋았습니다.
강의에서 프로젝트를 타임리프를 사용하기때문에 기본적잉 타임리프 문법들을 배웠습니다.
팀프로젝트 또한 타임리프로 진행하고 있기 때문에 많은 도움이 되었습니다.
구연지
MVC 1편에서 인상 깊었던 부분: 쓰레드 풀, 스프링 MVC의 흐름, 로깅
멀티 쓰레드, 쓰레드 풀
•
쓰레드란?
◦
프로세스의 실행 단위로 stack을 제외한 메모리 영역을 쓰레드끼리 공유한다.
▪
stack을 분리하는 이유: stack은 메소드가 실행될 때 파라미터와 같은 값들이 할당되는 공간 → stack을 분리함으로써 각각의 쓰레드에서 각각의 메소드를 실행할 수 있게 한다 → 멀티 쓰레드가 가능하게
•
멀티 쓰레드
◦
하나의 애플리케이션을 여러 쓰레드가 구성하도록 함 → 속도가 개선됨
◦
단점:
▪
요청이 올 때마다 쓰레드를 생성하면 응답 속도가 늦어진다: 쓰레드를 생성할 때 많은 비용이 소모된다
▪
코어보다 쓰레드 개수가 많은 경우 컨텍스트 스위칭 비용이 발생한다: 코어 1개에 1개의 쓰레드 대응된다
▪
쓰레드 생성에 제한이 없어 한계를 넘으면 서버가 죽을 수 있다.
•
쓰레드 풀: 필요한 쓰레드를 미리 생성해서 쓰레드 풀에 넣고 관리한다: 최대치를 넘으면 대기하거나 거절한다
◦
(1) 해결: 쓰레드가 이미 생성되어 있어 시간이 단축된다.
◦
(3) 해결: 쓰레드의 최대치가 정해져 있어 많은 요청이 들어와도 안전하게 처리할 수 있다.
◦
WAS의 주요 튜닝 포인트는 최대 쓰레드 개수
▪
너무 낮으면 응답 지연, 너무 높으면 서버 다운
스프링 MVC
구조
동작 순서
1.
핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
2.
핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
3.
핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.
4.
핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행한다.
5.
ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서
반환한다.
6.
viewResolver 호출: 뷰 리졸버를 찾고 실행한다.
JSP의 경우: InternalResourceViewResolver 가 자동 등록되고, 사용된다.
7.
View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를
반환한다.
JSP의 경우 InternalResourceView(JstlView) 를 반환하는데, 내부에 forward() 로직이 있다.
8.
뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다
로깅
•
SLF4J: 로그 라이브러리 들의 인터페이스
•
로그 레벨: TRACE(모든 로그 출력) > DEBUG > INFO > WARN > ERROR(에러만 출력)
◦
개발 서버는 주로 debug
◦
운영 서버는 info 출력
◦
application.properties에서 패키지 별로 로그 레벨 설정 가능
•
로그 출력을 할 때 log.debug("data = {}", data)의 형태를 하면 더하기 연산이 일어나지 않지만 log.debug("data="+data) 의 형태를 사용하면 의미 없는 문자 더하기 연산이 발생하므로 이 방법 지양하기
안지영
Spring MVC 1편 강의를 들으면서 가장 인상깊었던 내용
웹 서버와 웹 어플리케이션 서버
웹서버: 정적리소스를 제공하는버. 서버 특정 폴더에 파일을 두면 서버가 클라이언트의 요청에 따라 서빙
웹 어플리케이션 서버 WAS: 웹 서버 기능 포함(정적 리소스 제공 가능) + 프로그램 코드를 실행해서 애플리케이션 로직 수행 가능
→ 웹 서버는 정적 리소스 제공에, WAS는 애플리케이션 로직 처리에 더 중점을 둔다.
서블릿
서블릿은 비즈니스 로직 실행을 제외한 모든 기능을 자동으로 해준다. WAS 에서 요청 메세지를 기반으로 request, response 객체를 만든 후 서블릿 컨테이너로 전달. return을 하면 WAS는 response 객체를 바탕으로 HTTP 메세지를 만들어 브라우저에 전달한다. 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너
라고 한다.
FrontConroller 패턴
프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받고, 요청에 맞는 컨트롤러를 찾아서 호출한다. 이 패턴을 사용하면 프론트 컨트롤러를 사용한 나머지 컨트롤러는 서블릿을 사용하지 않는다.
스프링 MVC의 핵심도 FrontController이다. DispatcherServlet이 FrontController 패턴으로 구현되어 있다.
스프링 MVC 구조
HTTP 요청이 들어오면 DispatcherServlet에서 핸들러(컨트롤러)를 조회한다. 그 다음 해당 핸들러를 처리할 수 있는 핸들러 어댑터를 조회한다. 이후 핸들러 어댑터가 핸들러를 호출하고 ModelAndView를 반환한다. 뷰 리졸버를 호출하여 View를 렌더링하여 반환한다.
HTTP 요청 파라미터 vs HTTP 요청 메세지
클라이언트에서 서버로 요청 데이터를 전달하는 세가지 방법
1.
GET - 쿼리 파라미터
2.
POST - HTML Form
3.
HTTP message body에 데이터를 직접 담아서 요청
“요청 파라미터(request parameter)”은 1, 2번에 해당하고, “요청 메세지”는 3번에 해당한다.
요청 파라미터
@RequestParam:
•
@RequestParam의 name(value) 속성이 파라미터 이름으로 사용
•
required=false/true를 설정할 수 있다.
@ModelAttribute:
•
따로 따로 받은 요청 파라미터를 합쳐서 객체를 만들지 않아도 되도록 완전히 자동화 해준다.
스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다.
1.
HelloData 객체를 생성한다.
2.
요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
@ModelAttribute 는 생략할 수 있다. 그런데 @RequestParam도 생략할 수 있었다!
스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
String , int , Integer 같은 단순 타입 = @RequestParam
나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
김재근
이번 스터디를 하면서 처음 알게 된 내용정리
Servlet 의 특징
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
//애플리케이션 로직
}
}
Java
복사
•
urlPatterns(/hello) 의 URL이 호출되면 서블릿 코드가 실행됩니다.
•
HTTP의 요청, 응답을 편하게 사용할 수 있는 HttpsServletRequest, HttpServletResponse 가 있습니다.
•
개발자는 위 두가지를 이용해서 HTTP 스펙을 편리하게 사용할 수 있게됩니다.
•
하지만 개발자는 어떻게 데이터가 나가고 들어올 지 예상할 수 있어야 하기 때문에 HTTP의 스펙을 알아야 합니다.
SpringMVC의 동작 순서
1.
Handler 조회
2.
Handler Adapter 조회
3.
Handler Adapter 실행
4.
Handler 실행
5.
ModelAndView 반환
6.
viewResolver 호출
7.
View 반환
8.
View 렌더링
타임리프 간단히 알아보기
타임리프 사용 선언
<html xmlns:th=”http://www.thymeleaf.org”>
속성 변경 -th:href
th:href=”@{/css/bootstram.min.css}”
•
href=”value1” 을 th:”value2” 의 값으로 변경한다.
•
타임리프 뷰 템플릿을 거치게 되면 원래 값을 th:xxx 값으로 변경한다.
만약 값이 없다면 새로 생성한다!
•
대부분의 HTML속성을 변경할 수 있다.
타임리프의 핵심
•
th:xxx 가 붙은 부분은 서버사이드에서 렌더링이 되고, 기존의 것을 대체하게 된다.
•
HTML 파일로 열게되면 웹브라우저는 th: 속성을 알지 못하기 때문에 무시하고 표현하게 된다.
URL 링크 표현식 ( @{...} )
•
타임리프의 링크 표현식은 @{...} 으로 표현하는데, URL 링크 표현식을 사용하면 서블릿 컨텍스트를 자동으로 포함하게 된다.
리터럴 표현 ( |...|)
•
타임리프에서 문자와 표현식은 분리되어 있기 때문에 더해서 사용해야하는데,
해당 표현 방법을 이용하면 편리하게 사용할 수 있다!
•
파이썬의 fstring 표현 방법과 비슷하다.
@ModelAttribute - 요청 파라미터 처리
•
@ModelAttribute 는 Item 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)으로 입력해준다.
•
@ModelAttribute 는 중요한 한가지 기능이 더 있는데, 바로 모델(Model)에 @ModelAttribute 로 지정한 객체를 자동으로 넣어준다.
코드를 보면 model.addAttribute("item", item) 가 주석처리 되어 있어도 잘 동작하는 것을 확인할 수 있다.
모델에 데이터를 담을 때는 이름이 필요하다.
이름은 @ModelAttribute 에 지정한 name(value) 속성을 사용한다.
만약 다음과 같이 @ModelAttribute 의 이름을 다르게 지정하면 다른 이름으로 모델에 포함된다.
이번 주의 느낀점
김솔배
팀프로젝트를 하면서 스터디를 하기 시작했는데 생각보다 많은 도움이 되었습니다.
서블릿에서 MVC패턴까지 발전하는 과정을 알게되면서 다형성을 다시 공부할 수 있었고,
스프링에서 많은 기능을 제공한다는 것도 알게되었습니다.
한번 더 복습하면서 강의를 들어야 더 완벽히 스프링 디스패쳐와 메시지 컨버터 등 여러 기능들을
완전히 이해할 수 있을것 같습니다.
Java
복사
김재근
자바 스프링 공부를 시작하면서 바로 스프링부트를 사용해서
내부적으로 어떻게 돌아가는지 정확하게 몰랐는데, 이번에 스터디를 진행하면서
조금은 더 자세하게 내부적으로 어떤 흐름으로 돌아가는지 알 수 있게되었다.
나머지 내용도 언능 다 들어야겠다...
Plain Text
복사
안지영
순수 서블릿을 사용하는 것부터 spring MVC를 사용하는 과정까지를 꼭 직접 실습을 해봐야지
까먹지 않을 것 같다.
Plain Text
복사
구연지
MVC 패턴 이전에 사용하던 서블릿, jsp에서 시작해서
현재 사용하는 MVC 패턴으로 리팩토링 하면서 왜 MVC 패턴을 사용하게 되었는지 생생하게 느꼈다.
그리고 무심코 쓰던 스프링 MVC 모델의 기본을 살펴볼 수 있어서 좋았다.
Plain Text
복사