본문 바로가기

MVC

(22)
[MVC] 파일 업로드 📚 목차파일 업로드 소개서블릿과 파일 업로드스프링과 파일 업로드파일 업로드, 다운로드 📁 파일 업로드 소개일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다.  HTML 폼 전송 방식application/x-www-form-urlencodedmultipart/form-data 💡 application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법이다.  Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다.Content-Type: application/x-www-form-urlencoded그리고 폼에 ..
[MVC] 스프링 타입 컨버터 목차스프링 타입 컨버터란?타입 컨버터 - Converter컨버전 서비스 - ConversionService스프링에 Converter 적용하기뷰 템플릿에 컨버터 적용하기포맷터 - Formatter포맷터를 지원하는 컨버전 서비스포맷터 적용하기스프링이 제공하는 기본 포맷터 🍃 스프링 타입 컨버터 소개문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 타입을 변환해야 하는 경우가 상당히 많다. 문자 타입을 숫자 타입으로 변경@RestControllerpublic class HelloController { @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request) { // 문자 타입으로 조회 ..
[MVC] API 예외 처리 @ExceptionHandler 목차API 예외 처리 - 시작API 예외 처리 - 스프링 부트 기본 오류 처리API 예외 처리 - HandlerExceptionResolver API 예외 처리 - 스프링이 제공하는 ExceptionResolverAPI 예외 처리 - @ExceptionHandlerAPI 예외 처리 - @ControllerAdvice ✍ API 예외 처리 - 시작 🤔 API 예외 처리는 어떻게 해야할까?HTML 페이지의 경우 4xx, 5xx와 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있다.그런데 API의 경우에는 생각할 내용이 더 많다. 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다.지금부터 API..
[MVC] 예외 처리와 오류 페이지 ✍ 서블릿 예외 처리스프링이 아닌 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자.서블릿은 다음 2가지 방식으로 예외 처리를 지원한다.Exception (예외)response.sendError(HTTP 상태 코드, 오류 메시지) 1️⃣ Exception(예외) 자바 직접 실행자바의 메인 메서드를 직접 실행하는 경우 main 이라는 이름의 쓰레드가 실행된다.실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다.애플리케이션에서 예외가 발생했는데, 어디선가 try ~ catch로 예외를 잡아서 처리하면 아무런 문제..
[MVC] 필터, 인터셉터 목차서블릿 필터 - 소개서블릿 필터 - 요청 로그서블릿 필터 - 인증 체크스프링 인터셉터 - 소개스프링 인터셉터 - 요청 로그스프링 인터셉터 - 인증 체크ArgumentResolver 활용 ✍ 서블릿 필터 - 소개 공통 관심 사항요구사항을 보면 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야 한다.앞에서 로그인을 하지 않은 사용자에게는 상품 관리 버튼이 보이지 않기 때문에 문제가 없어 보인다. 그런데 문제는 로그인 하지 않은 사용자도 다음 URL을 직접 호출하면 상품 관리 화면에 들어갈 수 있다는 점이다. 품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 하나하나 작성하면 되겠지만, 등록, 수정, 삭제, 조회 등등 상품 관리의 모든 컨트롤러 로직에 공통으로 로그인 여부를 확인해야 한다. 더 큰..
[MVC] 로그인 구현하기(쿠키, 세션) 목차홈 화면 회원 가입 로그인 기능 로그인 처리하기 - 쿠키 사용 쿠키와 보안 문제 로그인 처리하기 - 세션 동작 방식 로그인 처리하기 - 세션 직접 만들기 로그인 처리하기 - 직접 만든 세션 적용 로그인 처리하기 - 서블릿 HTTP 세션세션 정보와 타임아웃 설정 패키지 구조 설계 🌟 ❝도메인이 가장 중요하다.❞ 도메인 = 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말한다.향후 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다.이렇게 하려면 web은 domain을 알고있지만 domain은 web을 모르도록 설계해야 한다. 이것을 web은 domain을 의존하지만, domain은 web을 의존하지 않는다고 표현한다. 예를 들어 w..
[MVC] Bean Validation 목차Bean Validation - 소개Bean Validation - 시작Bean Validation - 스프링 적용Bean Validation - 에러 코드Bean Validation - 오브젝트 오류Bean Validation - 수정에 적용Bean Validation - 한계Bean Validation - groupsForm 전송 객체 분리 - 소개Form 전송 객체 분리 - 개발Bean Validation - HTTP 메시지 컨버터 ✍ Bean Validation - 소개검증 기능을 지금처럼 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.public class Item { pri..
[MVC] Validation(검증) 검증 요구사항상품 관리 시스템에 새로운 요구사항이 추가되었다고 가정해보자.요구사항: 검증 로직 추가 1️⃣ 타입 검증가격, 수량에 문자가 들어가면 검증 오류 처리2️⃣ 필드 검증상품명: 필수, 공백X가격: 1000원 이상, 1백만원 이하수량: 최대 99993️⃣ 특정 필드의 범위를 넘어서는 검증가격 * 수량의 합은 10,000원 이상 만약 폼 입력시 숫자를 문자로 작성하거나해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다면사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 아마도 이런 서비스라면 사용자는 금방 떠나버릴 것이다. 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다.컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다. ..
[MVC] 메세지, 국제화 목차메시지, 국제화 소개 스프링 메시지 소스 설정 스프링 메시지 소스 사용 웹 애플리케이션에 메시지 적용하기 웹 애플리케이션에 국제화 적용하기  ✍ 메시지, 국제화 소개 메세지기획자가 화면에 보이는 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 어떻게 해야할까?여러 화면에 보이는  단어를 변경하려면 화면들을 다 찾아가면서 모두 변경해야 한다. 지금처럼 화면 수가 적으면 문제가 되지 않지만 화면이 수십개 이상이라면 수십개의 파일을 모두 고쳐야 한다.왜냐하면 해당 HTML 파일에 메시지가 하드코딩 되어 있기 때문이다.이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.  messages.properties  item=상품item.id=상품 IDitem.itemName=상품명i..
[MVC] Tymeleaf 스프링 통합과 폼 목차타임리프 스프링 통합 입력 폼 처리 요구사항 추가 체크 박스라디오 버튼 셀렉트 박스 ✍ 타임리프 스프링 통합타임리프는 크게 2가지 메뉴얼을 제공한다.기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위한 다양한 기능을 편리하게 제공한다. 그리고 이런 부분은 스프링으로 백엔드를 개발하는 개발자 입장에서 타임리프를 선택하는 하나의 이유가 된다.스프링 통합으로 추가되는 기능들스프링의 SpringEL 문법 통합 ${@myBean.doSomethi..