학습을 위해 프로젝트를 만들 때, Dependencies에 JDBC API, H2 Database, Lombok을 추가한다. H2 Database를 이용해 학습한다. JDBC? 지금 다루는 이야기는 데이터베이스의 원리와 구조를 이해하기 위한 과거의 이야기이다. JDBC의 등장 애플리케이션을 개발할 때 중요한 데이터는 대부분 DB에 저장한다. ...
JDBC 구조와 최신 기술
파일 업로드, 다운로드
일반적으로 파일 업로드는 HTML Form을 통해 이루어진다. 폼을 전송하는 두 가지 방식이 있다. application/x-www-form-urlencoded 일반적으로 form을 전송하는 방식 multipart/form-data application/x-www-form-urlencoded ...
스프링 타입 컨버터
문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 애플리케이션을 개발하다보면 타입을 변환해야 하는 경우가 상당히 많다. @RestController public class HelloController { @GetMapping("/hello-v1") public String helloV1(HttpServlet...
API에서의 예외 처리
HTML 페이지의 경우 4xx, 5xx와 같은 오류페이지만 있으면 대부분의 문제를 해결할 수 있다. 단순히 보여주면 된다. 하지만 API의 경우 생각할 내용이 많다. API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. 하던 방식으로 API에 적용해보자. @Component public class W...
예외 처리(오류 페이지)
사용자가 생각하지 못한 행동을 해서 NullPointException 같은 의도치 않은 예외, 오류가 발생하면 따로 오류 페이지를 만들어서 보여주는게 서비스 사용자 입장에서도 좋고 오류에 대처하기도 편할 수 있다. 이럴 때 어떻게 처리하는지 알아본다. 참고 Bean Validation 이용할 때, 스프링 프로젝트 생성 시 Dependenc...
필터, 인터셉터 (로그인)
필터는 서블릿이 제공하는 기능이고, 인터셉터는 스프링이 제공하는 기능이다. 둘은 각각의 장단점이 있다. 필터와 인터셉터의 필요성 홈페이지는 로그인을 한 사용자만 접근할 수 있는 페이지가 있다. 여태 해온 상품관리 프로젝트로 보면 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있는 것이다. 물론 프로젝트에서 로그인 한 사용자에게만 login_...
final 키워드
그동안 final 키워드에 대해 상수를 정의할 때 사용하고, 무조건 초기화해야 함을 명시적으로 사용할 때 사용한다고 알고 사용하고 있었다. 그러다 static 키워드에서처럼 핵심을 못잡고 사용한다는 느낌이 들어 정리해보기로 했다. final 키워드 재할당 불가를 명시할 때 사용한다. public void test() { final in...
Stream과 Optional
스프링을 학습하다보니 if문이나 다른 반복문을 많이 써야 하는 경우, Stream과 람다식으로 대체하면 쉽고 깔끔한 코드가 되는 경우를 많이 보았다. 아직 사용에 익숙하지 않아 Stream 기능에 대해 정리해보려 한다. 예시 public Member login(String loginId, String password) { return m...
로그인 처리 (쿠키, 세션)
요구사항 홈 화면 - 로그인 전 회원 가입 로그인 홈 화면 - 로그인 후 본인 이름(~님 환영합니다.) 상품 관리 로그 아웃 보안 요구사항 로그인 사용자만 상품에 접근하고, 관리 가능 로그인을 하지 않은 사용...
Bean Validation
검증 기능을 이전 Validation 포스트처럼 매번 코드로 작성하는 것은 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 충족하는 지 등의 일반적인 로직이다. public clas Item { private Long id; @NotBlank private String itemName; @NotNull...