웹은 http 프로토콜을 기반으로 통신한다웹 세상에서는 모든 것을 http를 기반으로 데이터를 주고 받는다. 심지어 서버-서버 간 통신도 그렇다.웹 서버는 http를 기반으로 동작한다.정적 리소스(http 통해 주고 받는 데이터)를 주고 받는다.웹 애플리케이션 서버(W
먼저 프로젝트를 생성해 준다. 주의할 점은 war를 패키지로 선택해야 jsp를 쓸 수 있다. 디펜던시는 스프링 웹과 롬복을 선택한다.인텔리제이에서 bulid.gradle 파일을 오픈해 프로젝트를 실행시켜준다.open as project로 실행시킨다.메인메소드를 실행시켜
@ServletComponentScan 어노테이션을 등록하면 스프링이 패키지 내의 서블릿을 자동으로 찾아 등록할 수 있게끔 한다.basic 패키지를 만들고 HelloServlet 이라는 클래스를 만든다.httpServlet을 상속받고 @WebServlet 어노테이션을
먼저 서블릿 리퀘스트에 대해 알아보겠다.http 요청 메세지를 개발자가 직접 파싱하면 매우 번거로우므로, 서블릿이 http 요청메세지를 파싱하여 사용할 수 있는 기능을 제공하며, 그 결과를 HttpServletRequest 객체에 담아 제공한다.HttpServletRe
클라이언트에서 서버로 데이터를 전달할 때는 딱 세 가지 방법이 있다.먼저 get 방식으로 쿼리 파라미터를 통해 데이터를 전달한다. 메세지 바디 없이 url에 데이터를 포함해 전달하는 것이다.다음은 post 방식으로 html form을 전송하는 것이다. 메세지 바디 안에
html form으로 데이터를 전송하는 것의 특징은 메세지 바디에 데이터가 들어가므로 content-type이 있고, 메세지 바디에 쿼리 파라미터 형식으로 데이터를 저장한다.form이 있는 html을 만들어준다. 요청시 /request-param으로 요청을 보낸다./r
HttpServletResponse의 역할은 http 응답 메시지를 생성하는 역할을 한다.http응답코드 지정, 헤더, 바디를 만들어 응답 메시지를 생성한다.또 컨텐트타입,쿠키,redirect 등 편의 기능까지도 지정한다.먼저 클래스를 세팅해준다.응답 코드는 respo
http 응답 메세지는 텍스트 응답, html응답, http api 등의 내용을 담아 제공한다.새로운 클래스를 세팅하고 컨텐트 타입을 명시해 준다.다음과 같은 html 코드를 담아 서버를 시작하면정상적으로 렌더링 되어 html 화면이 보여진다.그러면 단순 html이 아
다음과 같은 회원 정보와 기능을 다루는 웹 애플리케이션을 만들어보겠다.새로운 클래스를 생성하고 username 과 age를 가지는 생성자를 만든다.회원 저장소 MemberRepository를 만든다. 키는 id, 값은 member로 저장하는데 해시맵을 통해 만든다. s
순수 서블릿으로 회원 관리 애플리케이션을 만들어 보겠다. 먼저 회원 정보를 제출하는 서블릿을 만들어 보겠다. 역시 싱글톤이므로 getInstance를 통해 멤버저장소 객체를 가져온다.콘텐트타입과 인코딩 타입을 설정하고, Printwriter를 통해 테스트할 html 코
jsp 라이브러리를 추가한다.jsp 파일을 생성하고 서버에 뜨는지 확인한다.멤버를 저장할 save.jsp 파일을 만든다 <% %> 을 통해 자바 코드를 넣을 수 있다. 회원 저장 로직을 안에 넣어준다.html 태그 안에 유저정보를 출력하는 코드를 담고 서버를 실행
jsp 가 너무 많은 일을 하는 것을 덜기 위해서 mvc가 등장했고, ui와 비즈니스 로직의 변경 라이프 사이클을 따로 관리하고 위해서 mvc가 필요했다.mvc 패턴은 하나의 서블릿이나 jsp로 처리하던 것을 컨트롤러와 뷰라는 영역으로 서로 역할을 나눈 것이다.고객이
이제 직접 mvc 프레임워크를 서블릿을 통해 만들어 보겠다.프론트 컨트롤러 패턴 도입전에는 클라이언트가 공통 로직과 컨트롤 로직을 각각 전부 만들어야 했다.그러나 프론트 컨트롤러 서블릿을 도입해 이곳에 공통로직을 돌고 필요한 로직은 각자 처리하도록 할 수 있다.프론트
이 부분은 모든 컨트롤러에서 뷰로 이동하는 부분에서 중복된 코드다. 이를 분리하는 객체를 만들 것이다.이제는 Myview 객체를 만들어 프론트 컨트롤러가 Myview의 render를 호출하면 MyView가 jsp를 포워드 하는 구조로 바꿀 것이다. 컨트롤러가 jsp를
이제 서블릿에 대한 종속성을 제거할 것이다.요청 파라미터 정보는 MAP으로 대신 넘기면 컨트롤러가 서블릿 기술을 몰라도 동작시킬 수 있다.request 객체에 데이터를 담아 Model로 사용하는 대신에 Model 객체를 만들어 반환하도록 할 것이다.또 view 이름의
아키텍쳐가 단순하고 실용적인 v4 컨트롤러를 구현해보도록 하겠다.기본적인 구조는 v3와 같으나 컨트롤러가 ModelView를 반환하지 않고 viewName만 문자로 반환한다.이전에는 paraMap 만 넘겼는데, 이제는 직접 모델이 파라미터로 넘어온다. 프론트 컨트롤러가
어댑터 패턴을 사용해 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있도록 해보겠다.핸들러 매핑 정보를 찾으면 해당 컨트롤러를 처리할 수 있는 어댑터를 찾아, 프론트 컨트롤러가 핸들러 어댑터를 통해 컨트롤러를 호출한다.이제 컨트롤러를 핸들러라고 부르겠다.프론트
이제 v5 컨트롤러에 v4까지 처리할 수 있도록 해보겠다.v4 매핑 정보를 추가하고, v4 핸들러 어댑터를 추가해준다. 그러나 아직 v4 핸들러 어댑터가 없으므로 만들어 줘야 한다.따라서 MyHandlerAdapter를 implements 한 v4 핸들러 어댑터를 구현
1) MVC 전체 구조이전까지 직접 만들었던 스프링 mvc 구조다.이제 실제 스프링 MVC의 모습이다. 동작 구조가 완전히 같다. 그러나 명칭에만 차이가 있다.프론트 컨트롤러는 디스패쳐 서블릿으로 칭한다. 이게 젤 중요하다.디스패쳐 서블릿도 서블릿이므로, httpSer
@RequestMapping 어노테이션을 사용하는 컨트롤러를 통해 유연하고 실용적으로 핸들러 매핑과 핸들러 어댑터를 사용할 수 있다.새로운 회원 입력 컨트롤러를 생성한다. 컨트롤러 어노테이션과 @RequestMapping 어노테이션을 넣어준다.@Controller 가
이제 컨트롤러를 하나로 유연하게 통합하겠다.모든 컨트롤러를 하나로 통합한 SpringMemberControllerV2를 만들고 각 컨트롤러의 메소드를 모두 가져와 다른 이름으로만 구분해준다.서버에서 제대로 동작한다.그러나 세 컨트롤러의 Url 중 "/springmvc/
스프링은 개발자가 편리하게 개발할 수 있도록 수 많은 편의 기능을 제공한다.v3 컨트롤러를 만들 예정인데, v2 컨트롤러를 그대로 가져와 하나하나 고쳐 보겠다.먼저 회원 정보 부분은, 다음처럼 모델 앤 뷰가 아닌 그냥 스트링으로 반환만 해도 스프링이 뷰 이름으로 알고
스프링 부트에 Jar 를 사용하면 /resources/static/ 위치에 index.html 파일을 두면 Welcome 페이지로 처리해준다. (스프링 부트가 지원하는 정적 컨텐츠 위치에 /index.html 이 있으면 된다.실무에서는 print문이 아닌 로깅 라이브러
요청 매핑은 요청이 왔을 때 어떤 컨트롤러를 호출해야 하는지를 알려주는 것이다.MappingController 클래스를 생성해 준다.@RequestMapping("/hello-basic"): /hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다.
1) 기본,헤더 조회헤더정보를 담는 클래스를 생성해준다. url 요청을 보내고 로그를 확인해보면 헤더 정보가 콘솔에 넘어옴을 확인할 수 있다.MultiValueMap : MAP과 유사한데, 하나의 키에 여러 값을 받을 수 있다. HTTP header, HTTP 쿼리 파
1) 정적 리소스, 뷰 템플릿스프링에서 응답 데이터를 만드는 방법은 3가지다.웹 브라우저에 정적인 HTML, css, js를 제공할 때는, 정적 리소스를 사용한다.웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.HTTP API를 제공하는 경우에는 HT
1) 요구사항 상품을 관리할 수 있는 서비스 상품 도메인 모델 1.상품 ID 2.상품명 3.가격 4.수량 상품 관리 기능 1.상품 목록 2.상품 상세 3.상품 등록 4.상품 수정 ![](https://velog
메시지 만약 프로그램의 "상품명" 이라는 단어를 "상품이름"이라는 단어로 고쳐야 한다면 상당히 어렵다. 만약 화면이 수십개 이상이라면 이것을 전부 고쳐야 한다. 이처럼 해당 html 파일에 메세지가 하드코딩 되어 있기 때문이다. 따라서 이처럼 다양한 메세지를 한 곳
우테코 2단계 장바구니 테스트 미션을 수행하던 중, RandomPort 환경에서 통합 테스트를 수행하는 아래와 같은 테스트 코드를 작성했다.싱글벙글하게 메소드 단위에서 테스트를 돌리고 나서, 클래스 단위에서 테스트를 돌리니 갑자기 테스트가 실패하게 되었다.뭐지...?