분류 전체보기322 끝) 파일업로드 파일 업로드 소개 일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다. HTML 폼 전송 방식 application/x-www-form-urlencoded (일반적으로 form 전송하는 방식) multipart/form-data application/x-www-form-urlencoded 방식 application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다. Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다. Content-Type: application/x-www-form-urlencoded .. 인프런/스프링 MVC 2편 2023. 2. 13. 20) Formatter(포맷터) 포맷터 - Formatter Converter는 입력과 출력 타입에 제한이 없는, 범용 타입 변환 기능을 제공한다. 이번에는 일반적인 웹 애플리케이션 환경을 생각해보자. 불린 타입을 숫자로 바꾸는 것 같은 범용 기능 보다는 개발자 입장에서는 문자를 다른 타입으로 변환하거나,다른 타입을 문자로 변환하는 상황이 대부분이다. 앞서 살펴본 예제들을 떠올려 보면 문자를 다른 객체로 변환하거나 객체를 문자로 변환하는 일이 대부분이다. 애플리케이션에서 객체를 문자로, 문자를 객체로 변환하는 예시 화면에 숫자를 출력해야 하는데, Integer String 출력 시점에 숫자 1000 문자 "1,000" 이렇게 1000 단위에 쉼표를 넣어서 출력하거나, 또는 "1,000" 라는 문자를 1000 이라는 숫자로 변경해야 한다.. 인프런/스프링 MVC 2편 2023. 2. 12. 19) 스프링 타입 컨버터 스프링 타입 컨버터 문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 애플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 상당히 많다. 다음 예를 보자. HelloController - 문자 타입을 숫자 타입으로 변경 @RestController public class HelloController { @GetMapping("hello-v1") public String helloV1(HttpServletRequest request) { String data = request.getParameter("data"); //파라미터값은 String 타입으로 넘어온다. Integer intValue = Integer.valueOf(request.getParameter("data")); /.. 인프런/스프링 MVC 2편 2023. 2. 12. 18) API 예외처리 (3) API 예외 처리 - @ExceptionHandler HTML 화면 오류 vs API 오류 웹 브라우저에 HTML 화면을 제공할 때는 오류가 발생하면 BasicErrorController 를 사용하는게 편하다. 이때는 단순히 5xx, 4xx 관련된 오류 화면을 보여주면 된다. BasicErrorController 는 이런 메커니즘을 모두 구현해두었다. 그런데 API는 각 시스템 마다 응답의 모양도 다르고, 스펙도 모두 다르다. 예외 상황에 단순히 오류 화면을 보여주는 것이 아니라, 예외에 따라서 각각 다른 데이터를 출력해야 할 수도 있다. 그리고 같은 예외라고 해도 어떤 컨트롤러에서 발생했는가에 따라서 다른 예외 응답을 내려주어야 할 수 있다. 한마디로 매우 세밀한 제어가 필요하다. 앞서 이야기했지만, .. 인프런/스프링 MVC 2편 2023. 2. 12. 17) API 예외 처리(2) API 예외 처리 - HandlerExceptionResolver 예외가 발생해서 서블릿을 넘어 WAS까지 예외가 전달되면 HTTP 상태코드가 500으로 처리된다. 발생하는 예외에 따라서 400, 404 등등 다른 상태코드로 처리하고 싶다. 오류 메시지, 형식등을 API마다 다르게 처리하고 싶다. 예를 들어서 IllegalArgumentException 을 처리하지 못해서 컨트롤러 밖으로 넘어가는 일이 발생하면 HTTP 상태코드를 400으로 처리하고 싶다. 어떻게 해야할까? (IllegalArgumentException면 클라이언트가 데이터를 잘못넘겨서 발생하는 예외이다. 그런데 예외가 발생하면 500(Internal Server Error)의 상태코드로 되기 때문에 응답을 받은 클라이언트는 서버에 문제.. 인프런/스프링 MVC 2편 2023. 2. 10. 16) API 예외 처리 API 예외 처리 HTML 페이지의 경우 지금까지 설명했던 것 처럼 4xx, 5xx와 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있다. 그런데 API의 경우에는 생각할 내용이 더 많다. 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. 지금부터 API의 경우 어떻게 예외 처리를 하면 좋은지 알아보자. API도 오류 페이지(객체)에서 설명했던 것 처럼 처음으로 돌아가서 서블릿 오류 페이지(객체) 방식을 사용해보자. (스프링부트에서 제공하는 기본에러페이지,BasicErrorController를 사용하지않고, 서블릿만 이용한 방법을 해보자 (직접 에러페이지(객체)를 생성, 등록하고 에러페이지.. 인프런/스프링 MVC 2편 2023. 2. 9. 15) 예외 처리와 오류 페이지 프로젝트 생성 전체적인 구조를 한번 보고간다. 서블릿 컨테이너(Servlet Container) 란? 서블릿들을 위한 상자(Container) 입니다. velog.io 스프링 컨테이너와 서블릿 컨테이너 - 인프런 | 질문 & 답변 안녕하세요! 강의를 든던중 궁금한 점이 있어서 이렇게 질문 남깁니다. 스프링 컨테이너는 서블릿 컨테이너의 한 종류라고 인식을 해도 되는걸가요? - 질문 & 답변 | 인프런... www.inflearn.com 서블릿 예외 처리 스프링이 아닌 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자. 서블릿은 다음 2가지 방식으로 예외 처리를 지원한다 Exception (예외) (우리가 보는 일반적인 예외, ex ) 널포인트예외 등등 response.sendError(HTTP 상태.. 인프런/스프링 MVC 2편 2023. 2. 9. 14) 로그인 처리2 - 인터셉터 , ArgumentResolver 활용 스프링 인터셉터 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다 인터셉터의 흐름 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. (스프링 MVC의 시작점이 디스패처 서블릿이라고 생각해보면 이해가 될 것이다.) 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀하게 설정할 .. 인프런/스프링 MVC 2편 2023. 2. 8. 13) 로그인 처리2 - 필터 서블릿 필터 요구사항을 보면 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야 한다. 앞에서 로그인을 하지 않은 사용자에게는 상품 관리 버튼이 보이지 않기 때문에 문제가 없어 보인다. 그런데 문제는 로그인 하지 않은 사용자도 다음 URL을 직접 호출하면 상품 관리 화면에 들어갈 수 있다는 점이다. 상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성하면 되겠지만, 등록, 수정, 삭제, 조회 등등 상품관리의 모든 컨트롤러 로직에 공통으로 로그인 여부를 확인해야 한다. 더 큰 문제는 향후 로그인과 관련된 로직이 변경될 때 이다. 작성한 모든 로직을 다 수정해야 할 수 있다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting conce.. 인프런/스프링 MVC 2편 2023. 2. 8. 12) 로그인처리 - 쿠키, 세션 (실전) 로그인 처리하기 - Servlet Http Session (서블릿 http 세션) 1 세션이라는 개념은 대부분의 웹 애플리케이션에 필요한 것이다. 어쩌면 웹이 등장하면서 부터 나온 문제이다. 서블릿은 세션을 위해 HttpSession 이라는 기능을 제공하는데, 지금까지 나온 문제들을 해결해준다. 우리가 직접 구현한 세션의 개념이 이미 구현되어 있고, 더 잘 구현되어 있다. HttpSession 서블릿이 제공하는 HttpSession 도 결국 우리가 직접 만든 SessionManager 와 같은 방식으로 동작한다. 서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다. 세션 정리 https://www.infle.. 인프런/스프링 MVC 2편 2023. 2. 8. 11) 로그인처리 - 쿠키, 세션 직접 개발,적용해보기(개념단계) 프로젝트 패키지 구조 domain item memeber login web item memeber login 도메인 도메인이 가장 중요하다. 도메인 = 화면, UI, 기술 인프라 등등의 영역을 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함 WEB 과 도메인이 나눠져있는 이유 향후 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다. 이렇게 하려면 web은 domain을 알고있지만 domain은 web을 모르도록 설계해야 한다. 이것을 web은 domain을 의존하지만, domain은 web을 의존하지 않는다고 표현한다. 예를 들어 web 패키지를 모두 삭제해도 domain에는 전혀 영향이 없도록 의존관계를 설계하는 것이 중요하다. 반대로 이야기하면 domain은 web을.. 인프런/스프링 MVC 2편 2023. 2. 6. 10) Bean Validation, @Validated(@Valid) ,프로젝트 (V3~V4) 검증 기능을 지금처럼 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다 이전에 Validaotor(검증기)를 만들면서 컨트롤러를 깔끔하게 만들었는데 하지만 Validator 내부코드는 좀 지저분하고, 반복적인 검증이 많다. @Component //스프링빈에 등록시켜서 컨트롤러에서 쉽게 가져다 쓰기위함 public class ItemValidator implements Validator { @Override public boolean supports(Class clazz) { return Item.class.isAssignableFrom(clazz); //매개변수로 들어오는 클래스타입과 ite.. 인프런/스프링 MVC 2편 2023. 2. 5. 이전 1 ··· 8 9 10 11 12 13 14 ··· 27 다음