[Spring / JPA] 일대다 매핑과 빌더 패턴
·
Framework & Library/Spring
📕 JPA의 일대다 매핑 관계 📗 엔티티 설계 다음과 같이 Spiring JPA와 Lombok을 사용한 Member 와 Characters 간 1:N 관계가 있다고 가정을 하자 [Member] @Entity @Getter @Setter @NoArgsConstructor public class Member extends BaseTimeEntity { /** * 회원 목록 테이블 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private long id; @Column(unique = true) private String username; private String password; @Enumerat..
[CS / DesignPattern] 빌더 패턴 (with Lombok)
·
Computer Science
📕 빌더 패턴 📗 빌더 패턴이란? 복잡한 객체들을 단계별로 생성할 수 있도록 하는 GoF 디자인 패턴 중 생성 패턴에 해당하는 패턴이다. 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공한다. 📗 왜 나왔을 까? 객체를 생성시 생성자(Constructor)만 사용할 때 발생할 수 있는 문제를 개선하기 위해 나왔다. 예시로 다음과 같은 Member 클래스가 있다고 하자. @Entity @Getter @Setter @NoArgsConstructor public class Member extends BaseTimeEntity { /** * 회원 목록 테이블 */ @Id @GeneratedValue(strategy = GenerationType.IDE..
[Java / Spring] API 문서 자동화 Swagger
·
Framework & Library/Spring
📕 개요 Spring뿐만 아니라 다른 어떤 언어, 프레임워크로 백엔드를 개발했을 때, Rest API를 개발하고 그 API에 대한 문서를 정리하여 해당 API를 사용하는 클라이언트 및 서버 개발자들에게 문서를 정리해서 공유하는것은 필수이다. 기존에는 노션이나 엑셀을 사용하여 정리를 했었는데 이런식으로 노션을 사용해서 정리를 했었는데 단점이 너무 많다. 일일이 코드에서 구현내용, 설계 내용들을 끌고와서 입력해야 한다. api 설계가 바뀌면 노션 문서도 수정해야한다. 그러던중 Swagger에 대해 알게 되었고, 적용해보았다. 📕 Swagger란? Swagger 는 API를 설계하고 문서화 및 테스팅이 가능한 프레임워크이며, 무료 버전과 상용 버전 모두 존재한다. Swagger 에는 아래 5개 기능이..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 11. 파일 업로드
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 HTML 폼 전송 방식 📗 application/x-www-form-urlencoded HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법 Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가 Content-Type: application/x-www-form-urlencoded 그리고 폼에 입력한 전송할 항목을 HTTP Body에 문자로 username=kim&age=20와 같이 &로 구분해서 전송 파일을 업로드하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 하므로 문자를 전송하는 이 방식으로 파일을 전송하기는 어..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 10. 스프링 타입 컨버터
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 스프링 타입 컨버터 소개 문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 애플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 상당히 많다. 예시 [HelloController] - 문자 타입을 숫자 타입으로 변경 @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request) { String data = request.getParameter("data"); //문자 타입 조회 Integer intValue = Integer.valueOf(data); //숫자 타입으로 변경 System.ou..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 9. API 예외 처리
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 API 예외 처리 API의 경우에는 생각할 내용이 더 많다. 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. [ApiExceptionController] - API 예외 컨트롤러 @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 8. 예외 처리와 오류 페이지
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 서블릿 예외 처리 📗 서블릿 예외 처리 - 소개 스프링이 아닌 순수 서블릿 컨테이너의 예외 처리 서블릿은 다음 2가지 방식으로 예외 처리를 지원한다 Exception (예외) response.sendError(HTTP 상태 코드, 오류 메시지) Exception(예외) 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료 웹 애플리케이션 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 ..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 7. 로그인 처리2 - 필터, 인터셉터
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 서블릿 필터 📗 서블릿 필터 - 소개 공통 관심사(cross-cutting concern) 애플리케이션 여러 로직에서 공통으로 관심이 있는 것 상품관리의 모든 컨트롤러 로직에 공통으로 로그인 여부를 확인 로그인과 관련된 로직이 변경될 경우 작성한 모든 로직을 다 수정해야 함 스프링 AOP 대신 서블릿 필터 또는 스프링 인터셉터를 사용하여 해결 필터는 서블릿이 지원하는 수문장이다. 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터가 호출 된 다음에 서블릿이 호출 필터는 특정 URL 패턴에 적용할 수 있음 /* 이라고 하면 모든 요청에 필터가 자적용 스프링을 ..
[Java / Spring] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 6. 로그인 처리1 - 쿠키, 세션
·
책&강의 정리
본 내용은 인프런 김영한님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의 내용을 정리한 것입니다. 📕 로그인 처리하기 - 쿠키 사용 📗 로그인 상태 유지하기 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달 브라우저는 해당 쿠키를 지속적으로 요청에 담음 쿠키 생성 클라이언트 쿠키 전달 1 클라이언트 쿠키 전달 2 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지 📗 쿠키 생성 로직 Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); 로그인에 성공하면 쿠키를 생..