본문 바로가기
반응형

Framework & Library/Spring Boot164

[Spring Boot] : Model 추가해서 Front Controller에서만 Servlet 사용하기 이번 파트는 반복해서 봐야한다. 어려운 부분이 확실히 있는 것 같다. 우선, 서블릿 종속성을 제거해 주었다. Controller에서 HttpServletRequest와 HttpServletResponse가 안 쓰이는 경우가 종종 있었는데 그것을 해결해 주었다. 요청 파라미터 정보를 Map으로 넘겨 Controller가 Servlet을 몰라도 동작하도록 하였다. request 또한 강의에서 model로 사용했고 따로 Model 객체를 만들어 반환하도록 했다 이렇게 하면 코드가 단순해지고 테스트 코드 작성도 간단해 진다고 한다. 중복되는 것은 서블릿 관련만 있는 게 아니었다. 뷰 이름(경로) 또한 중복되고 있었다. 컨트롤러에서 뷰의 논리 이름을 반환하고 실제 물리 위치는 프론트 컨트롤러에서 처리하도록 단순화.. 2022. 1. 22.
[Spring Boot] : Controller에서 View 이동 시 중복되는 부분 리펙터링하기 컨트롤러에서 뷰로 이동하는 부분에 중복이 있어 깔끔하지 않다. String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); 계속 dispatcher 부분을 중복해서 적어주고 있는데 이런 부분을 깔끔하게 리펙터링하기 위해서는 별도로 뷰를 처리하는 객체를 만들어 줘야한다. 이렇게 되면 클라이언트가 HTTP 요청을 했을 때 Front Controller가 매핑 정보를 확인해서 알맞는 Controller를 호출해 주고 Controller는 뷰를 처리하는 객체를 반환해 준다. 다시 Front .. 2022. 1. 22.
[Spring Boot] : Front Controller 구현해보기 Front Controller를 추가해서 구조를 맞추고 리펙터링 해 나간다. 프론트 컨트롤러를 추가하면 클라이언트가 HTTP 요청을 넣었을 때 프론트 컨트롤러가 받고 URL 매핑 정보에서 컨트롤러를 조회한 뒤 알맞는 컨트롤러를 호출해 주게 된다. 그럼 호출된 컨트롤러가 JSP forward를 통해 JSP로 보내주고 HTML 응답을하게 되는 것이다. public interface ControllerV1 { void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } 우선 서블릿과 비슷한 모양의 컨트롤러 인터페이스를 생성해 준다. 각 컨트롤러들은 이 인터페이스 컨트롤러를 .. 2022. 1. 22.
[Spring Boot] : Front Controller란? Front Controller 도입 전에는 클라이언트가 각 컨트롤러를 호출하는 형식으로 사용을 했는데 프론트 컨트롤러 도입 후에는 클라이언트가 프론트 컨트롤러를 호출하면 프론트 컨트롤러가 호출에 맞는 컨트롤러를 연결해 주는 역할을 하게 된다. 즉, 프론트 컨트롤러 패턴을 활용하면 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받고 요청에 맞는 컨트롤러를 찾아서 호출하는 입구가 한 개가 되는 것과 같다. 이렇게 되면 공통 처리가 가능하고 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다고 한다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다. 2022. 1. 21.
[Spring Boot] : MVC 패턴 적용해보고 한계 체크하기(3) MVC 패턴을 사용하면 확실히 컨트롤러와 뷰의 역할을 명확히 구분이 가능하다. 때문에 코드들이 깔끔해지고 직관적으로 된다. 하지만 컨트롤러에는 중복이 많이 있고 필요 없는 코드들이 아직 존재한다. 전 글에서도 dispatcher.forward() 부분이 중복되어서 내가 복사 붙여넣기로 글을 적었다고 쓴 것 같은데 그런 부분이 예시이다. 아직 이렇게 중복이 잦은 코드들이 존재한다. 그리고 사용하지 않는 코드들도 있었다. 예를 들면 HttpServletRequest와 HttpResponse가 그렇다 위에 불러와 놓고 사용하지 않는 경우가 있었고 이 두개는 테스트 코드를 작성하기도 어렵다고 한다. 추가로 기능이 복잡해 질 수록 컨트롤러에서 공통으로 처리해야 하는 부분도 늘어날 것인데 이 경우 메서드를 항상 호.. 2022. 1. 21.
[Spring Boot] : MVC 패턴 적용해보고 한계 체크하기(2) 서블릿을 컨트롤러로 사용하고 JSP를 뷰로 사용하는 MVC 패턴을 사용해 본다. 사실 이거는 내가 전에 진행했던 프로젝트 구성과 비슷해서 친근한데 이제는 잘 안 쓰는 기술이라고 한다. 앞으로 조금 더 발전된 기술을 배우기 위해 열심히 강의를 듣고 공부를 한다. 회원 등록 폼 -View를 먼저 코딩해 본다. 강의 자료에서 발췌한 부분으로 모든 부분을 오픈할 수는 없고 일부분을 뗴어올 수 있다 출처는 글 맨 아래 남긴다. String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); dis.. 2022. 1. 21.
[Spring Boot] : MVC 패턴 적용해보고 한계 체크하기(1) 전에 공부했듯이 서블릿과 JSP는 한계가 있다. 프로젝트가 커질수록 더 코드도 복잡해지고 하나의 페이지가 너무 많은 역할을 하게 되고 결국 유지보수가 어려워지게 된다. 강의에서는 변경 라이프 사이클을 중요하게 다루고 있다. 예로는 UI 수정과 비즈니스 로직 수정은 각각 다르게 발생할 가능성이 매우 높고 서로에게 영향을 주지 않는데 이렇게 라이프 변경 사이클이 다른 부분을 하나의 코드로 관리하는 것은 유지보수에 좋지 않다고 한다. 때문에 라이프 사이클이 다른 코드를 분리해 주는 것이 매우 중요하다. MVC 패턴은 Model, View, Controller의 약자이다. MVC 패턴에서는 위에서 하나의 페이지에서 처리한 것들을 좀 분산해서 서로 역할을 나눈 것을 말 하며 보통 웹 애플리케이션에서 자주 사용된다.. 2022. 1. 21.
[Spring Boot] : JSP로 회원 관리 구현하기 JSP를 사용하기 위해 라이브러리를 먼저 추가해 주었다. //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP 추가 끝 build.gradile에 dependencies {} 안에 추가해 주면 된다. 추가하고 refresh해 주는 것을 잊지 않도록 한다. username: age: 전송 먼저 회원 등록 form을 코딩해 주었다. 맨 윗 줄에 있는 코드는 jsp를 사용하기 위해 꼭 있어야 하는 코드라고 한다.(JSP문서라는 뜻이고 JSP문서는 이렇게 시작한다고 한다.) 보면 html을 사용하기 위한 형식과 utf-8로 인코딩을 설정해주고 java 사용을 명.. 2022. 1. 21.
[Spring Boot] : Servlet을 통한 회원 관리 웹 애플리케이션 구현 서블릿을 통해 회원 등록 HTML 폼을 만들어 본다. w.write( "\\n" + " username: \\n" + " age: \\n" + " 전송\\n" } 일부 코드인데 PrintWriter w = response.getWriter(); 를 통해 HTML 코드를 작성해 준다. response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); 사전에 response 객체 설정을 통해 HTML을 읽을 수 있는 형식으로 셋팅을 해 주어야 한다. 이렇게 하면 단순하게 회원 정보를 입력할 수 있는 HTML Form이 생긴다. input으로 값을 받고 submit으로 값을 전달해준다. 값을 입력하고 전송을 누르면 데이터가 저장이 되도록.. 2022. 1. 21.
[Spring Boot] : 회원 정보를 간단하게 저장하고 조회를 할 수 있는 기능을 구현 회원 정보를 간단하게 저장하고 조회를 할 수 있는 기능을 구현해 본다. @Data public class Member { private Long id; private String username; private int age; } 회원 관련 데이터를 만들어 주었고 lombok 라이브러리를 통해 @Data 어노테이션을 사용해서 Getter와 Setter를 자동 생성하게 해 주었다. 강의에서는 @Getter @Setter를 사용했는데 스터디에서 배운 @Data 어노테이션을 활용해 보았다. lombok 공식 문서 @Data 참고 public class MemberRepository { private static Map store = new HashMap(); private static long sequence.. 2022. 1. 21.
[Spring Boot] : HTTP 응답을 JSON으로 반환하기 response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); **HelloData helloData = new HelloData(); helloData.setUsername("Oh"); helloData.setAge(27); //{"username" : "Oh", "age" : 27} String result = objectMapper.writeValueAsString(helloData); response.getWriter().write(result);** HTTP 응답으로 JSON 반환할 때는 ContentType을 application/json 형식으로 지정을 해줘야 한다. 참고하면 스펙상 utf-8을 지원하기.. 2022. 1. 20.
[Spring Boot] : HTTP 단순 텍스트 응답과 HTML 응답 HTTP 응답 데이터 - 단순 텍스트, HTML 단순 텍스트 응답, HTML 응답, HTTP API - MassageBody JSON 응답이 있다. 단순 텍스트 응답은 writer.println(”ok”);를 통해 사용했었고 HTML응답을 체크해 본다. response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); HTTP 응답으로 HTML을 반환할 때는 content-type을 text/html로 지정해야 한다. PrintWriter writer = response.getWriter(); writer.println(""); writer.println(""); writer.println(" 안녕?"); writer.println.. 2022. 1. 20.
[Spring Boot] : HttpServletResponse 기본 사용법과 응답 코드 HttpServletResponse 기본 사용법과 응답 코드 HttpServletResponse는 인터페이스이며 ServletRequest를 상속받는다. public interface HttpServletRequest extends ServletRequest { } 실제로 확인해 보면 이렇게 인터페이스로 구현되어 있는 것을 확인할 수 있다. 추가로 공식 문서를 참고하면 이렇다. Extends the ServletResponse interface to provide HTTP-specific functionality in sending a response. For example, it has methods to access HTTP headers and cookies. The servlet container.. 2022. 1. 20.
[Spring Boot] : HTTP message body를 통한 데이터 전송, 파라미터 조회 HTTP message body HTTP API에서 주로 사용한다. JSON, XML, TEXT 데이터 형식은 주로 JSON을 사용한다. @WebServlet(name = "RequestBodyStringServlet", urlPatterns = "/request-body-string") public class RequestBodyStringServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletInputStream inputStream = request.getIn.. 2022. 1. 19.
[Spring Boot] : HTTP의 Form을 통해 클라이언트에서 서버로 데이터 전송하기 HTTP의 Form을 통해 클라이언트에서 서버로 데이터를 전송한다. 주로 회원 가입이나 상품 주문 등에서 자주 사용한다고 한다. username: age: 전송 HTML의 Form 태그의 action 속성을 통해 값을 받을 경로를 설정하고 button 태그의 submit을 주어 action의 경로로 데이터를 전달하게 된다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부한 내용입니다. 2022. 1. 19.
[Spring Boot] : Get 쿼리 파라미터를 통해 파라미터를 조회하기 GET 쿼리 파라미터 username=OHJUHYEON age=27 위 데이터를 클라이언트에서 서버로 전송하는데 URL의 쿼리 파라미터를 통해 데이터를 전송해 본다. GET 쿼리 파라미터를 통해 파라미터를 조회하는 방법은 3가지 정도가 있다. request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName))); 파라미터 전체를 다 조회하는 방법이다. String username = request.getParameter("username"); String age = request.getParameter("age"); 단일.. 2022. 1. 19.
[Spring Boot] : HTML, HTTP API, CSR, SSR 정적 리소스 고정된 HTML, CSS, JS 등을 제공한다. 요청 → 이미 생성된 리소스 파일 ( /C/hello.html 등)을 웹 브라우저에 보내준다. HTML 페이지 동적으로 필요한 HTML 파일을 생성해서 전달한다. 요청 → WAS에서 DB 조회를 한다. → 동적으로 HTML을 생성한다. (JSP, 타임리프 등) → HTML을 웹 브라우저에 보내준 HTTP API HTML이 아니라 데이터를 전달한다. JSON 형식 사용한다. 다양한 시스템에서 호출한다. HTTP 위에 JSON을 통해 데이터를 주고 받는다. -> 웹 백엔드 개발자 백엔드 개발자는 정적 리소스, HTML 페이지(동적), HTTP API이 세 가지 방법에 대해 고민을 해 봐야 한다. SSR | 서버 사이드 렌더링 서버에서 최종 HTML.. 2022. 1. 18.
[Spring Boot] : Thread, 쓰레드에 대해서 클라이언트에서 서브를 요청하면 WAS가 응답을 하는 게 보통이다. 서블릿은 누가 호출하지? 쓰레드가 호출한다. 쓰레드란? 애플리케이션 코드를 순차적으로 실행한다. 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다. 자바에서는 메인 메서드를 실행하게 되면 main이라는 이름의 쓰레드가 실행하게 된다. 쓰레드는 한 번에 하나의 코드 라인만 수행한다. 동시 처리에 경우 필요에 따라 쓰레드를 추가 생성한다. 단일 요청 : 쓰레드를 하나만 사용한다. 요청이 들어온다. → WAS에서 쓰레드를 할당한다. → 쓰레드는 서블릿을 호출한다. → 서블릿이 요청에 응답한다. 위와 같은 원리로 움직이지만 만약 쓰레드 요청이 여러개 들어왔을 경우를 보자. 요청이 들어왔고 쓰레드를 할당 받아서 서블릿을 호출하고 있는데 어떤 이유.. 2022. 1. 18.
[Spring Boot] : Servlet, 서블릿 Servlet urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행된다. 서블릿 컨테이너 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다. 서블릿 객체는 싱글톤으로 관리한다. 요청마다 객체를 생성하는 것은 비효율적이다. 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다. 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다. 공유 변수 사용을 주의한다. 싱글톤을 사용할 때는 멤버 변수를 사용할 때 조심해야 한다. JSP도 서블릿으로 변환되서 사용한다. 동시 요청을 위한 멀티 쓰레드 처리를 지원한다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부한 내용입니다. 2022. 1. 18.
[Spring Boot] : Web Server와 Web Application Server 웹 서버 HTTP 기반으로 동작한다. 정적 리소스와 부가 기능들을 제공한다. 웹 애플리케이션 서버 (WAS) HTTP 기반으로 동작한다. 웹 서버 기능을 포함한다. 정적 리소스 제공 및 부가 기능 등 프로그램 코드를 통해 애플리케이션 로직 실행이 가능하다. 동적 HTML, HTTP API(JSON), ( REST API ) 서블릿, JSP, 스프링 MVC Tomcat, Jetty 등 웹 서버와 WAS 차이 웹 서버는 정적 리소스 제공, WAS는 애플리케이션 로직을 실행할 수 있다. 차이가 애매하다. 웹 서버도 프로그램을 실행하는 기능을 포함하기도 한다. 웹 애플리케이션 서버도 웹 서버의 기능을 제공한다. 자바는 서블릿 컨테이너 기능르 제공하면 WAS 서블릿 없이 자바코드를 실행하는 서버 프레임워크도 있다.. 2022. 1. 18.
[Spring Boot] : lombok(롬복)라이브러리 추가 및 플러그인 설치하기 [Spring Boot] : lombok(롬복)라이브러리 추가 및 플러그인 설치하기 lombok 라이브러리 추가하는 방법 plugins { // 부트 버전이 표시되어 있습니다. id 'org.springframework.boot' version '2.6.1' // 의존관계 관련된 부분도 설정이 되어 있습니다. id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } // 처음에 설정한 스프링 부트 그룹 네임 설정 group = 'hello' version = '0.0.1-SNAPSHOT' // 자바 11 버전을 쓴다고 되어 있습니다. sourceCompatibility = '11' repositories { mavenCentral.. 2022. 1. 10.
반응형