https://brew.sh

 

Homebrew

The Missing Package Manager for macOS (or Linux).

brew.sh

Homebrew란? 

  • Homebrew란 Ruby로 개발된 MacOS용 패키지 관리 애플리케이션(패키지 매니저)이다.
  • 즉, 터미널에 명령어를 입력하는 것으로 프로그램의 설치, 삭제, 업데이트를 관리할 수 있도록 한다. 
  • 기존의 방법: 사이트 방문 -> 설치 파일 다운 -> 설치 파일 실행 -> 설치
  • Ubuntu의 apt-get, CentOS의 yum과 같은 역할을 수행한다. 

Homebrew 설치

  • 사이트의 가이드를 따르면 된다. 

  • 터미널에 해당 명령어를 입력한 후, 맥 패스워드를 입력한다. 
  • 엔터키 클릭
  • brew -v로 설치 확인
  • 완료

Homebrew 주요 명령어

🍅패키지 설치: brew install {패키지명}

  • 패키지 제거: brew uninstall {패키지명}

  • 모든 패키지 업그레이드: brew upgrade
  • 패키지 업그레이드: brew upgrade {패키지명}
  • 설치된 패키지 업그레이드 여부 확인: brew outdated
  • 설치된 패키지 확인: brew list
  • 패키지 검색: brew search {패키지명}

나머지는 필요할때 찾아보자

특이점

  • Homebrew는 오픈 소스 기반 패키지 매니저이다. 
  • Homebrew를 설치해도 Homebrew를 이용해 설치한 프로그램들은 여전히 존재한다. 

Cask란?

  • Homebrew를 이용하여 GUI기반 어플리케이션을 설치하기 위한 유틸리티

 

Cask 설치

  • 위에서 설치한 brew를 이용해서 설치 가능한다. 
brew install cask

 

Cask 사용

  • brew [명령어] 사이에 cask만 추가해주면 된다. 
  • 예시) brew cask install {패키지이름}

김영한님의 인프런 [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]강좌를 참고하여 작성하였습니다. 

https://inf.run/NqFF

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com


회원 관리 웹 애플리케이션 요구사항

🍅위치

  • src.main.java.hello.servlet.domain.member.Member
  • src.main.java.hello.servlet.domain.member.MemberRepository

🍅src.main.java.hello.servlet.domain.member.Member

  • 클래스명 위에 lombok을 이용한 @Getter, @Setter 라이브러리를 추가해주었다. 
  • 필드는 Long 형식의 id, String 형식의 username, integer형식의 age이다. 
  • 기본 생성자와 username, age를 파라미터로 가지고 있는 생성자를 작성하였다. 

🍅src.main.java.hello.servlet.domain.member.MemberRepository

  • 싱글톤방식으로 프로그램을 설계하기 위해서는 private로 생성자를 외부로부터의 접근을 막아야 한다. 

  • 멤버를 저장할 수 있는 save 메소드를 정의하였다. 
  • 아이디를 이용하여 멤버를 조회할 수 있는 findById 메소드를 정의하였다. 
  • store에 있는 모든 values를 리스트에 넣어 반환받을 수 있는 findAll 메소드를 정의하였다. 
  • 테스트 코드 작성을 위한 clearStore 메소드를 정의하였다. 

🍅 MemberRepositoryTest 

  • 테스트 코드 작성을 위해 MemberRepository 객체를 생성할때, new를 이용한 생성은 불가능하다. 왜냐하면 싱글톤방식을 이용하고 있기 때문에 생성자에 외부에서 접근할 수 없기 때문이다. 
  • 따라서 getInstance() 메소드를 이용하여 새로운 객체를 MemberRepository 내부에서 생성해주었다. 


서블릿으로 회원 관리 웹 애플리케이션 만들기

  • 본격적으로 서블릿을 이용해 회원 관리 웹 애플리케이션을 만들어보자. 
  • 가장 먼저 서블릿으로 회원 등록 HTML 폼을 제공해보자. 

🍅 src.main.java.hello.web.servlet.MemberFormServlet.java

  • 역시 MemberRepository 객체를 생성할 때에는 new 키워드 대신 getInstence()메서드를 이용한다. 

  • 서블릿을 실행해보면 다음과 같은 form이 나타난다. 

  • Ctrl + U로 소스보기를 확인해보면 다음과 같은 HTML코드를 확인할 수 있다. 

  • 개발자도구-Form Data를 확인해보면 입력한 내용을 확인 할 수 있다. 
  • 다만 전송을 해도 오류 페이지가 드게 된다. 왜냐하면 입력해준 코드의 form태그를 살펴보면 action 속성에 입력된 데이터를 보내줄 경로의 파일이 존재하지 않기 때문이다. 

🍅src.main.java.hello.web.servlet.MemberSaveServlet.java

  • HTML Form 데이터를 전달받는 서블릿을 만들었다. 
  • 파라미터를 조회하여 Member 객체를 만든다. 
  • Member 객체를 MemberRepository를 통해서 저장한다. 
  • Member 객체를 사용해서 결과 화면용 HTML을 동적으로 만들어서 응답한다. 

  • getParameter을 통해 각 필드에 전달받은 값을 HTML코드를 이용하여 화면에 나타내주었다. 

🍅src.main.java.hello.web.servlet.MemberListServlet.java

  • 회원저장 서블릿에서 저장한 회원 리스트를 출력해 주는 서블릿 생성하였다. 
  • 저장한 회원 정보는 메모리에 저장되게 되고, 해당 서블릿의 경로로 들어가면 저장된 회원 정보가 나타난다. 
  • for문을 이용하여 members에 저장된 멤버 객체들이 동적으로 출력된다. 

  • 저장한 정보가 출력되었다. 

🍅템플릿 엔진으로

  • 이렇듯 서블릿과 자바 코드로 동적으로 원하는 HTML을 마음껏 만들 수 있으나 매우 비효율적이다. 
  • 자바 코드로 HTLM을 만들어 내는 것 보다 차라리 HTML문서에 동적으로 변경해야 하는 부분만 자바 코드를 넣는 것이 더 효율적이다.  -> 템플릿 엔진이 나온 이유. 
  • 템플릿 엔진의 예시
    • JSP, Thymeleaf, Freemarker, Velocity 등
  • 참고 : JSP는 성능과 기능면에서 다른 템플릿 엔진과의 경쟁에서 밀리는 추세이다. 
  • 강의에서는 JSP만 잠깐 만다루고 스프링과 잘 통합과는 Thymeleaf를 사용할 것이다. 

🍅Welcome파일 변경

  • index.html파일을 변경해주었다. 자세한 코드는 강의로 확인😊

JSP로 회원 관리 웹 애플리케이션 만들기

🍅 JSP 라이브러리 추가

implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'javax.servlet:jstl'
  • build.gradle에 다음 JSP라이브러리를 추가한다. 
  • 작성자의 스프링부트는 3.0버전 미만이기에 해당 코드를 추가해주었다. 

🍅 회원 등록 JSP (webapp/jsp/members/new-form.jsp)

  • url창에는 webapp 그 하위디렉토리부터 /로 구분하여 입력한다. 
  • Form으로 입력받은 데이터는 "/jsp/members/save.jsp" 로 전달한다. 

  • 당장은 데이터를 보낼 경로에 해당하는 JSP가 존재하지 않기 때문에 에러페이지가 뜬다. 
  • 개발자도구로 확인했을 때 입력한 정보를 request에서 확인할 수 있다. 

🍅 회원 저장 JSP (webapp/jsp/members/save.jsp)

  • 자바 코드를 작성하려면  <% %> 태그를 사용한다. 
  • <% %>태그가 아닌 곳에서 자바 코드를 작성하려면 (값을 가져올 때) <%= %>코드를 사용한다. 

🍅 회원 목록 JSP (webapp/jsp/members.jsp)

  • <% %>태그를 이용하여 서블릿 실습때와 같이 MemberRepository 객체를 getInstance()메서드를 통해 생성해준다. 

  • out.write를 이용하여 동적으로 회원 정보를 출력해준다. 

 

🍅 서블릿과 JSP의 한계

  • 서블릿으로 개발할 때는 뷰(View)화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡했다. 
  • 하지만 JSP는 너무 많은 역할을 맡게 된다. -> 유지보수 지옥

🍅 MVC 패턴의 등장

  • 역할을 나눌 순 없을까..!?

MVC 패턴 - 개요

  • 너무 많은 역할
    • 하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하게 되면, 너무 많은 역할을 하게 되고, 결과적으로 유지보수가 어려워진다. 
  • 변경의 라이프 사이클
    • 사실상 제일 중요한 문제. 진짜 문제는 둘 사이의 변경의 라이프 사이클이 다르다는 것이다. 
  • 기능 특화
    • JSP같은 뷰 템플릿은 화면을 렌더링하는데 최적화 되어 있기 때문에, 이 부분의 업무만 담당 하는 것이 가장 효과적이다. 

🍅 MVC (Model View Controller)

  • 컨트롤러
    • HTTP요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 
    • 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
    • 참고
      • 컨트롤러에 비즈니스 로직을 줄 수도 있지만 이렇게 되면 컨트롤러가 너무 많은 역할을 담당한다. 
      • 그래서 일반적으로 비즈니스 로직은 서비스라는 계층을 별도로 만들어서 처리한다. 
      • 컨트롤러는 비즈니스 로직이 있는 서비스를 호출하는 역할을 담당한다. 
  • 모델
    • 뷰에 출력할 데이터를 담아둔다. 
    • 뷰가 필요한 데이터를 모두 모델에 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
    • 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다. 
    • 여기서는 HTML을 생성하는 부분을 말한다. 

컨트롤러가 비즈니스 로직 수행 후 모델에 데이터를 담은 뒤 뷰 로직을 호출하고, 뷰 로직은 모델 데이터를 참조하여 화면을 나타내는 것이다. 


MVC 패턴 - 적용

🍅 서블릿 생성(java.hello.servletmvc.MvcMemberFormServlet.java)

  • dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능이다. 서버 내부에서 다시 호출이 발생한다. 
  • redirect와는 다르다. 

🍅view 역할을 할 JSP파일 생성(webapp/WEB-INF/views/new-form.jsp)

  • 절대경로(/로 시작)가 아닌 상대경로(/로 시작하지 않는)를 사용하면 폼 전송시 현재 URL이 속한 계층 경로 + save가 호출된다.
  • WEB-INF 경로 안에 있다면 해당 JSP를 외부에서 직접 호출할 수 없다. 
    • 우리가 기대하는 것은 항상 컨트롤러를 통해서 JSP를 호출하는 것이다. 

  • 실행 결과이다. 아직은 오류가 난다. 

 

🍅 회원저장 - 컨트롤러 (MvcMemberSaveServlet)

🍅 회원 저장 결과 뷰 (/WEB-INF/views/save-result.jsp)

🍅 회원 목록 조회 - 컨트롤러 (MvcMemberListServlet)

🍅 회원 목록 조회 결과 뷰 (/WEB-INF/views/members.jsp)

 


MVC 패턴 - 한계

🍅 MVC 컨트롤러의 단점

  • forward 중복
    • View로 이동하는 코드가 항상 중복 호출되어야 한다. 
  • ViewPath에 중복
    • prefix: /WEB-INF/views/
    • suffix: .jsp
    • 만약 jsp가 아닌 thymeleaf같은 다른 뷰로 변경한다면 전체 코드를 다 변경해야 한다. 
  • 사용하지 않는 코드(사용할때도~ 사용하지 않을때도 있는)
    • 예시 : response 
  • 공통 처리가 어렵다. 
  • ==> 즉 공통처리에 어려움이 있음. 
  • ---> 프론트 컨트롤러(Front Controller) 패턴을 도입해보자. 

김영한님의 인프런 [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]강좌를 참고하여 작성하였습니다. 

https://inf.run/NqFF

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com


프로젝트 생성

🍅. https://start.spring.io/ 사이트에서 프로젝트를 생성해준다. 

  • Packaging을 보통은 Jar로 사용하지만 War로 설정해준다. 
    • War을 사용하는 경우는 JSP를 돌려야 하는 경우인데 강의에서JSP를 공부할 예정이기 때문에 War를 설정해주는 것. 
  • Dependencies는 Spring Web과 Lombok을 추가해준다. 
  • generate를 누른 후 원하는 위치에 압축을 풀어준다. 
  • JAVA11을 사용한다면 SpringBoot를 2.xx 로 설정해 주어야 한다고 한다고 한다. 따라서 작성자도 추후 다시 생성하였다.

  • open > 압축을 푼 프로젝트의 build.gradle 선택 > open as project 선택
  • 처음엔 시간이 좀 걸린다. packaging이 War로 되어 있는지 한 번 더 확인!

  • Settings - Gradle에서 설정 또한 IntelliJ IDEA로 바꿔주어야 속도가 빨라진다.

  • Settings - Plusins - Maketplace에서 Lombok을 설치해준다. 

  • 롬복 사용시 Annotation Processor에서 Enable Annotation processing을 체크 해주어야 한다. 


Hello 서블릿

  • 고전적인 방법으로는 톰캣과 같은 서버 직접 설치 - 서블릿 코드 클래스 파일로 빌드 - 톰캣 서버 실행. => 번거롭다.
  • 스프링 부트는 톰캣 서버를 내장하고 있으므로 톰캣 서버 설치 없이 편리하게 서블릿 코드 실행이 가능하다. 

🍅 스프링 부트 서블릿 환경 구성

  • @ServletComponenetScan은 서블릿을 자동으로 등록해주는 어노테이션이다. 

  • HelloServlet 클래스를 생성 후, HttpServlet을 상속받아준다. 
  • ctrl + o 한 후 service 중 자물쇠 표시가 되어있는 protect 메소드를 호출해준다. 

  • IntelliJ 단축키 soutm을 입력해 클래스 명을 출력해준다. 
  • 실행한 후, 웹 브라우저 주소창에 localhost:9090/hello를 입력하니 빈 화면이 뜬다. 
  • 요청 메세지를 던진 것과 마찬가지이다. 

  • getParameter을 통해서 손쉽게 쿼리 파라미터를 조회할 수 있다 .
  • 응답메세지를 보내보겠다. 
  • 값을 넣으면 응답 메세지에 데이터가 담겨서 나가게 된다. 

  • application.properties에 디버그 모드로 설정해준 후 요청을 하면 콘솔창에 정보를 띄워준다. 
  • 요청이 성공적으로 되었는지 확인이 가능하게 해준다. 

  • 웹 애플리케이션 서버의 요청 응답 구조이다. 
  • HTTP 응답에서 Content-Length는 웹 애플리케이션 서버가 자동으로 생성해준다.

🍅 Welcome 페이지 추가 

  • 개발할 내용을 편리하게 참고할 수 있도록 welcome 페이지를 만들어 두었다. 
  • webapp - index.html
  • http://localhost:9090 호출시 index.html 페이지가 열리게된다. 

  • basic.html 또한 추가해주었다. 


HttpServletRequest - 개요

  • HTTP를 직접 파싱해도 되지만 서블릿은 개발자가 HTTP 요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메세지를 파싱해준다. 
  • HttpServletRequest를 사용하면 다음과 같은 HTTP 요청 메세지를 조회할 수 있다. 
  • 서블릿은 결과를 'HttpServletRequest' 객체에 담아서 제공한다. 

🍅HTTP 요청 메세지

...
POST / save HTTP/ 1.1
Host: localhost : 8080
Content-Type: application/x-www-form-urlencoded

username=kim&age=20
...
  • START LINE
    • HTTP 메소드
    • URL
    • 쿼리 스트링
    • 스키마, 프로토콜
  • 헤더
    • 헤더 조회
  • 바디
    • form 파라미터 형식 조회
    • message body 데이터 직접 조회
  • HttpServletRequest를 사용하면 위와 같은 HTTP 메세지를 편리하게 조회할 수 있다. 

 

🍅  HttpServletRequest 역할1 :  임시 저장소 기능

  • 해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
    • 저장 : 'request.setAttribute(name, value)
    • 조회 : 'request.getAttribute(name)

🍅  HttpServletRequest 역할2 :  세션 관리 기능

  • request.getSession(create: true)

HttpServletRequest - 기본 사용법

  • 클래스 생성 후, HttpServlet을 상속받아주었다.
  • @WebServlet 어노테이션을 통해 서블릿 이름과 경로를 설정해주었다.

🍅 Start-line 정보

  • 소스 코드 전체를 드래그 한 후, ctrl + Alt + Shift + T 를 눌러 extract method로 메소드를 뽑아내었다. 

  • 메소드를 실행 후, http://localhost:9090/request-header 경로를 들어가주니 정보가 출력되었다. 

  • http://localhost:9090/request-header?username=hello
  • username의 정보가 들어간 쿼리스트링을 덧붙여보니 null값으로 출력된 쿼리 스트링 부분이 username=hello로 바뀌어 출력되었다. 

🍅 헤더 정보

 

  • getHeaderNames를 이용하여 Header에서 정보를 꺼내주었다. 

  • asIterator 기능을 이용하여 출력하는 방법도 있다. 
  • 동일하게 출력되었다. 

 

🍅 Header 편리한 조회

  • 해당 코드를 작성 후, service 에 printHeaderUtils(request)로 호출한 후, 실행해주었다. 
  • request.getLocale은 제일 우선순위의 언어를 반환한다. 
  • cookie.getName()으로 원하는 이름의 쿠키를 꺼낼 수 있다. 
  • Postman을 이용하여 getContentType()을 더 알아보도록 하자. 

  • POST 방식으로 Body에 Text 형식의 내용을 담았다. 
  • header을 확인해 보면 Content-Type이 text/plain으로 표시된 것을 볼 수 있다. 
  • Send로 정보를 보내준다. 
  • ** localhost://9090으로 변경하였다. 

  • Postman이 만들어서 보내준 정보로 의해 ContentType()의 값이 text/plain으로 변경된 것을 볼 수 있다. 

🍅 기타 정보


HTTP 요청 데이터 - 개요

🍅 데이터를 전달하는 방법 3가지 (클라이언트 -> 서버)

  • GET - 쿼리 파라미터
    • /url?username=hello&age=20
    • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
    • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식
    • 아래의 캡쳐와 같이 구글에 hello라고 검색했을 시, URL 부분에 ?로 시작하는 쿼리 스트링을 확인할 수 있다. 

  • POST - HTML Form
    • content-type: application/x-www-form-urlencoded
    • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
      • 조회할시, GET과 호환이 된다. 추후에 설명 예정
    • 예) 회원 가입, 상품 주문, HTML Form 사용
  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON, XML, TEXT
    • 데이터 형식은 주로 JSON 사용
    • POST, PUT, PATCH

HTTP 요청 데이터 -  GET 쿼리 파라미터

  • 다음 데이터를 클라이언트에서 서버로 전송해보자.
  • 전달 데이터
    • username=hello
    • age=20
  • 메시지 바디 없이, URL의 '쿼리 파라미터'를 이용해서 데이터를 전달하자. 
  • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식
  • 쿼리 파라미터는 '?'를 시작으로 보낼 수 있으며, 추가 파라미터는 '&'로 구분한다. 

  • request 패키지에 RequestParamSevlet 클래스를 생성해준 후, 동일한 이름을 가진 서블릿을 만들어 주었다. 

  • 아직 파라미터가 없기 때문에 아무것도 출력되지 않았다. 

  • 쿼리 스트링 형태로 입력한 파라미터가 콘솔창에 출력되었다. 

  • 단일 파라미터 또한 조회할 수 있다. 

  • 복수의 값이 입력될 경우 처음 파라미터만 조회 가능하다. 어떻게 해결할 수 있을까?

  • getParameterValues를 이용하여 파라미터 값을 받아준 후, 배열에 넣어줌으로 이를 해결할 수 있다. 

HTTP 요청 데이터 -  POST HTML Form

  • HTML의 Form은 주로 회원 가입, 상품 주문 등에서 사용하는 방식이다. 

🍅 특징

  • content-type : application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다. username=hello&age=20

 

🍅 실습 코드 작성 : hello-form.html

  • webapp하위에 basic디렉터리를 생성해준 후, hello-form.html 파일을 생성해 주었다. 
  • hello-form.html파일은 "/request-param"으로 post방식으로 데이터를 보내준다. 

 

  • 실행 후 username="tomato"&age="24"를 입력했다. 
  • 입력한 내용은 /request-param 서블릿으로 POST방식으로 전달된다. 

  • 개발자도구를 확인해 보면 Form Data 부분에 입력한 값이 포함되어 있는 것을 확인할 수 있다. 

🍅 참고

  • request.getParameter()는 GET URL 쿼리 파라미터 형식, POST HTML Form 형식 둘 다 지원한다. 

🍅 Postman을 사용한 테스트

  • Postman으로 테스트를 진행해도 HTML 파일을 만들어 테스트한 것과 결과는 같다. 

HTTP 요청 데이터 -  API 메시지 바디 - 단순 텍스트

  • HTML message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON, XML, TEXT
    • 데이터 형식은 주로 JSON사용
    • POST, PUT, PATCH

🍅 예제 파일 : RequestBodyStringServlet

  • ServletInputStream을 사용하면 데이터를 바이트로 받아오기 때문에 텍스트로 바꾸기 위해 StreamUtils를 사용해 text파일로 바꿔주었다. 
    • 단, 인코딩 방식을 알려줘야 한다. 

  • 서버를 재시작하고 postman을 이용하여 hello!라는 데이터를 날려주었다. 

HTTP 요청 데이터 -  API 메시지 바디 - JSON

🍅 JSON 형식 전송

  • POST http://localhost:9090/request-body-json
  • content-type : "application/json"
  • message Body: {"username": "hello", "age":20}

🍅 JSON 형식 파싱 추가

  • lombok 의존성을 추가해주었기 때문에 lombok.Getter, lombokSetter을 import해주는 것만으로도 게터세터를 입력하지 않아도 된다. 
  • 다만 어노테이션을 꼭 붙여주도록 하자. 

🍅 예제 코드 작성 : RequestBodyJsonServlet

🍅 Postman으로 실행하기


HttpServletResponse - 기본 사용법

🍅 HttpServletResponse 역할

  • HTTP 응답 메시지 생성
    • HTTP 응답코드 생성
    • 헤더 생성
    • 바디 생성
  • 편의 기능 제공
    • Content-Type, 쿠키, Redirect

🍅 HttpServletResponse - 기본사용법

  • response.setHeader을 이용하여 설정한 값으로 적용되어 있는 것을 볼 수 있다. 

🍅 Content 편의 메서드

🍅 쿠키 편의 메서드

🍅 리다이렉트 편의 메서드


Http 응답 데이터 - 단순 텍스트, HTML

HTTP 응답 메시지는 주로 다음 내용을 담아서 전달한다.

  • 단순 텍스트 응답 (예 : writer.println("ok");)
  • HTML 응답
  • HTTP API - MessageBody JSON 응답

🍅 HttpServletResponse - HTML 응답

  • html 형식으로 HTTP응답을 하려면 contentType을 text/html으로 해주고 인코딩 설정까지 해주어야 한다. 


Http 응답 데이터 - API Json

  • content-type을 application/json으로 지정해야 한다. 
  • Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()를 사용하면 객체를 JSON문자로 변경할 수 있다. 

+ Recent posts