Servlet 12

파일 업로드

일반적으로 HTML Form을 통해 파일 업로드 기능을 구현한다. 먼저 HTML Form 전송 방식 두 가지를 알아보자. - application/x-www-form-urlencoded - multipart/form-data application/x-www-form-urlencoded 이 방식은 HTML Form을 서버로 전송하는 가장 기본적인 방법이다. 별도의 "enctype"옵션이 없으면 웹 브라우저는 요청 HTTP 헤더에 아래와 같이 추가한다. Content-Type : application/x-www-form-urlencoded Form에 입력한 데이터를 HTTP Body에 문자로 &로 구분하여 전송하게된다. 파일 업로드를 위해서는 파일은 문자가 아니라 바이너리 데이터를 전송해야하는데 문자를 전송..

Spring/Spring MVC 2021.08.12

API 예외 처리

HTML 페이지의 경우에는 4xx, 5xx.html과 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있지만, API의 경우에는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야한다. 어떻게 이를 처리할 수 있을까? 먼저 처음으로 돌아가 Servlet 오류 페이지 방식을 사용해보자. api를 처리하는 컨트롤러를 만들고 내부에 static 클래스로 memberDto를 만들어 진행하겠다.(실제 작업시에는 별도로 생성해야함) @RestController이기 때문에 id가 ex가 아니라면 json형식으로 응답이 반환될 것이고 ex라면 RuntimeException이 발생해 오류 페이지를 내부적으로 호출해 반환될 것이다. 먼저 정상 요청이다. 다음으로 런타임에러를 발생시켜본다...

Spring/Spring MVC 2021.07.28

예외 처리, 오류 페이지

Servlet 예외 처리 최종적으로 알고 싶은 것은 스프링의 예외처리이지만, 서블릿 컨테이너위에서 스프링이 돌아가기 때문에 서블릿이 어떻게 예외처리를 하는지부터 알고가자. 스프링이 아닌 순수 Servlet 컨테이너는 예외를 어떻게 처리할까?? Serlet은 2가지 방식으로 예외 처리를 지원한다. - Exception(예외) - response.sendError(HTTP 상태 코드, 오류 메시지) 🔧 Exception 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행되는데, 이 때 예외를 catch하지 못하고 main메서드를 넘어 예외가 throw되면 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션은 사용자 요청 별로 쓰레드가 할당되고, Servlet 컨테이너 안에서..

Spring/Spring MVC 2021.07.24

필터, 인터셉터

필터는 Servlet이 제공하는 기능이고, 인터셉터는 Spring이 제공하는 기능이다. 요구사항 : 로그인한 사용자만 상품 관리 페이지로 접속할 수 있어야한다. 단순히 상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 추가하면 되겠지만 등록/수정/삭제/조회 등 모든 컨트롤러에 추가하는 것은 매우 비효율적이다. 또한 향후에 로직이 변경될 때마다 모든 로직을 다시 수정해야한다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사(Cross-Cutting Concern)라고 한다. 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 Servlet의 필터나 Spring의 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리하기 위해서는 HTTP H..

Spring/Spring MVC 2021.07.21

쿠키, 세션

참고 : 패키지 구조 설계 도메인이 가장 중요하다.(도메인 : 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야하는 핵심 비즈니스 영역) domain-webweb을 다른 기술로 바꾸어도 domain은 그대로 유지될 수 있도록 설계해야한다.즉, web은 domain을 알지만 domain은 web을 모르도록..(web을 모두 삭제해도 domain에는 영향이 가지 않게)의존관계는 단방향으로 흐르게 하는 것이 좋다. 2021.07.17 - [Spring] - 패키지 구조 설계 1. 회원 가입 들어온 Form 데이터를 검증하고, Repository에 save를 진행하는 단순한 구조이다. 2. 로그인 파라미터로 들어온 로그인id로 Member 객체를 조회하고 조회된 객체의 password와 파라미터..

Spring/Spring MVC 2021.07.17

Model 추가

서블릿 종속성 제거 요청 파라미터 정보는 Map으로 넘기도록 하면 현재 구조에서는 Controller가 서블릿 기술을 몰라도 동작할 수 있다. request 객체를 Model로 사용하는 대신 별도의 Model 객체를 만들어서 반환하면 된다. 현재는 request객체 내부 저장소를 Model처럼 사용하고 있음. Controller가 서블릿 기능을 전혀 사용하지 않도록 변경해보자 뷰 이름 중복 제거 Controller 에서 지정하는 뷰 이름에 중복이 있음. Controller는 뷰의 논리 이름을 반환하고, Front Controller에서 이를 실제 위치로 처리하도록 단순화 Front Controller에서 처리하도록 만들면, 뷰의 폴더 위치가 변해도 Front Controller만 변경하면 되므로 훨씬 코..

Spring/Spring MVC 2021.04.18

MVC Pattern

하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하게 되면, 너무 많은 역할을 하게되고, 결과적으로 유지보수가 어려워진다. 비즈니스 로직을 호출하는 부분에 변경이 발생해도 해당 코드를 수정해야하고, UI를 변경할 일이 있어도 비즈니스 로직이 함께 있는 파일을 수정해야한다. 코드의 양이 수백 수천줄이라면 이 작업은 매우 어려워지고 복잡해진다. 변경의 라이프 사이클 둘 사이의 변경 라이프 사이클이 다르다는 점이다. UI를 일부 수정하는 일과 비즈니스 로직을 수정하는 일은 각각 다르게 발생할 가능성이 매우 높고 대부분 서로에게 영향을 주지 않는다. 이렇게 변경의 Life Cycle이 다른 부분을 하나의 코드로 관리하는 것은 유지보수하기에 좋지 않다. 기능 특화 JSP 같은 뷰 템플릿은 화..

Spring/Spring MVC 2021.04.10

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

먼저 JSP 라이브러리 추가 build.gradle에 아래 코드 추가하고 refresh jsp는 .java파일이 아니라 .jsp파일이므로 java폴더 밖에 만들어야함 jsp 파일에는 저 코드가 꼭 있어야한다. jsp파일이라는 의미 save.jsp에 회원 저장 로직이 들어갈 것이다. 전송을 눌러보면 아직 save.jsp를 만들지 않았기 때문에 Not Found가 뜬 것이지, URL은 제대로 전송된 것을 확인할 수 있음 save.jsp jsp도 결국 서블릿으로 변환되어 사용되는 것이기 때문에 request, response를 사용할 수 있음 위에 로직을 먼저 넣고 그 밑에 html을 배치하는 것이 일반적 다시 전송시켜보면 정상적으로 회원이 저장된 것을 확인할 수 있다. members.jsp (회원 목록 조회..

Spring/Spring MVC 2021.04.09

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

회원 가입 Form 회원 저장 현재 Form이 전송되는 페이지가 servlet/member/save로 저장되어 있기에 이 페이지를 만들고 회원을 저장하는 로직을 만들어야함. 회원가입 성공 member.getUsername()과 같은 동적인 코드를 넣을 수 있음 회원 목록 조회 처음에 접속해보면 현재 저장된 회원이 없으므로 아무것도 출력되지 않음 servlet/members/new-form에 가서 회원 두명을 저장한 후에 다시 열어보자. 템플릿 엔진으로 지금까지 서블릿과 자바 코드만으로 HTML을 만들었다. 서블릿 덕분에 동적으로 원하는 HTML을 만들 수 있었다. 하지만 코드에서 보듯이 매우 복잡하고 비효율적이다. 자바 코드로 HTML을 만들어 내는 것보다 차라리 HTML문서에 동적으로 변경해야하는 부분..

Spring/Spring MVC 2021.04.06

HttpServletResponse

HttpServletResponse 역할 HTTP 응답 메시지 생성 HTTP 응답코드 지정 헤더 생성 바디 생성 편의 기능 제공 Content-Type, 쿠키, Redirect HTTP 응답코드 해당 인터페이스로 들어가보면 응답코드들이 이미 만들어져있으므로 이것을 가져다 사용하기만 하면된다. response-header setHeader를 통해 헤더를 생성할 수 있다. 더보기 먼저 아무것도 캐싱하지 않으려면 Cache-Control: no-store 를 하면됩니다. 또는 no-cache, no-store, must-revalidate로 no 시리즈를 다 붙여줍니다. Cache-Control: no-cache 는 가장 많이 헷갈려하는 헤더 설정인데요. no-cache이지만 cache하지 말라는 뜻이 아닙니..

Spring/Spring MVC 2021.04.06
반응형