공부기록
Spring-Rest Docs(1)
목차 Spring-Rest Docs(1) IDE내에서도 static/docs 확인 가능 asccidoctor 작업 이후 생성된 HTML 파일을 static/docs 로 copy build 의 의존작업 명시 jar 빌드 전에 doc생성build 폴더 내에서만 확인 가능 (7,8,9 과정 실행시 굳이 안해도 됨) jar안에 static/docs directory로 doc copy Spring 공식 문서를 참조하여 설정했습니다 테스트코드 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; im..
Spring boot CORS 설정
스프링 부트로 REST API 서버를 만들면 테스트 다돌려보고 마지막으로 postman에서까지 실행이 잘 되는데 프론트쪽에서 실행할 때 에러가 나는 경우가 있었다 이번에 처음 겪어본 에러였는데 SOP를 따르지 않아서 발생하는 문제였다 CORS(Cross-Origin Resource Sharing) 다른 출처의 자원들을 공유하는 것을 의미한다 따라서 CORS를 설정해주지 않거나 제대로 설정하지 않은 경우 원하는대로 자원을 공유하지 못하게 된다 처음에 다른 출처라는 것에 대해서 이해하는데 정확히 어떤 의미인지 어려운 감이 있었다 우선 다른 출처에 대해서 먼저 알고 넘어가겠다 출처(Origin) 출처는 URL의 Protocol Host Port로 구분된다 Protocol : Http, Https, FTP와 같..
DTO관련 고민
컨틀롤러와 서비스간 값을 전달할 때 어떤 형식으로 보내야 하는가 1. 고민시작 졸업작품 프로젝트를 진행을 끝내고 시간적 여유가 있는 다음달부터 코드 정리를 하기 위해서 기능적인 부분 수정이나 명칭 변경과 같이 TODO목록을 작성하던 도중 가장 코드가 많은 Service계층과 Controller계층 사이에 데이터 전달되는 형식이 어느것은 DTO를, 어느것은 Entity를 사용하면서 일관적이지 않은 것을 보고 정말 많은 고민이 시작되게 되고 방안들을 생각해 봤다. 선행 기준 방안을 생각하기에 앞서 무조건 선행된 기준은 있었다. Controller는 client로 부터 Entity가아닌 DTO로 값을 받고 DTO를 넘겨주게된다 DTO란 프로세스간 데이터를 전달하는 객체 마틴 파울러가 정의한 내용 첫번째 고민 ..
람다 2
앞서 람다를 왜쓰는지 Version1부터 6까지 알아왔다 이번엔 람다를 어떻게 작성하는지 람다는 어디에 쓰이는지에 대해서 알아보겠다 람다 작성법 (파라미터) -> {람다 바디} 람다는 파라미터와 화살표 바디 이렇게 세개로 이루어져 있다 이전에 사용하던 익명 클래스를 단순화 하여 나타낸 것이다 저번 글에 Version4를 보면 사용하는 예제가 있을 것이다 기억이 나지 않는다면 아래 링크를 가서 확인해보면 되겠다 람다 사용 예제 몇가지 규칙이 있긴한데 일단 이런게 있다고 보고 몇번 사용하다보면 금방 감이 올것이다 매개 변수 타입은 생략가능 --> 추후 설명 매개 변수가 하나만 있다면 괄호 생략 가능 (user) -> user.getName().equals("userB") --> user -> user.get..
람다
람다란 메서들 전달 할 수 있는 함수를 단순화 한 것 그니까 코드를 더 짜기 귀찮아서 간결하게 표현하기 위해서 만들어 진 것이 람다식이다 람다를 알기 전에 도데체 어떤 코드를 간결하게 표현을 하는 것이고 덜 짜는 지에 대해 알기 위해서 가장 기초적인 자바 문법을 가지고 차례대로 개선을 해 나갈 것이다 예제에서 사용 될 모델 public class User { private String name; private int age; private Role role; } public enum Role { USER, ADMIN } private static List users; static { users = Arrays.asList( new User("userA", 10, Role.USER), new User("u..
Spring - 예외처리
서블릿 예외처리 예외가 발생할 경우 ex) RuntimeException... response.sendError()로 예외를 전달 할 경우 --> 당장 예외가 발생하는 것이 아니라 서블릿 컨테이너에 전달, 응답전에 컨테이너가 확인 어플리케이션 내에서 예외처리가 되지 않을경우(try~catch) WAS까지 예외 전달 되어 예외페이지 출력된다 예외페이지 등록 예외페이지 등록 web.xml 404 /error-page/404.html java @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factor..
Spring-filter interceptor
서블릿 필터 필터내에서 특정 조건을 만족하지 못한다면 해당 필터에서 끝을 내고 컨트롤러를 호출하지 않도록 제어하는 역할이다 체인 형식으로 여러개의 필터를 순차적으로 등록하여 사용할수 있다 로그인관련에서 사용 흐름 Http 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 호출 Interface Filter인터페이스를 상속받아서 구현을 한다 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //초기화시 호출 } @Override public void doFilter(ServletRequest request, ServletResponse..
JPA- JPQL
경로표현식 상태필드: 단순 값 저장 필드 (m.username), 추가 탐색 불가 단일값 연관필드: XXXToOne연관, 추가 탐색 가능(member.team.teamname), 묵시적 inner join발생 컬렉션 값 연관 필드: XXXToMany연관, 추가 탐색 불가, 묵시적 inner join 발생 직접 명시적 조인으로 사용 페치조인 JPQL에서 성능 최적화를 위해 제공되는 기능 연관된 엔티티나 컬렉션을 같이 조회하는 기능 fetch전략을 LAZY로 설정을 해두더라도 가지고 올때 한번에 조회를 한다 다대일 페치조인 jpql select m from Member m join fetch m.team sql로 변환시 select m.*, t.* from Member m inner join team t o..
JPA-JPQL
JPQL 엔티티 객체를 조회하는 객체지향 쿼리이다 테이블 대상이 아닌 객체를 대상으로 쿼리를 실행한다 간단한 예시를 보면 아래 sql문은 테이블 전체를 조회하는 반면 jpql은 Member객체를 조회하는 것을 볼 수있다 실행이 될때는 결국 sql문을 변환되어 실행이 된다 이때 어느 한 데이터베이스에 종속 된 것이 아니기 때문에 방언만 변경을 해주면 해당 데이터베이스에 맞게 변환하여 실행한다 sql select * from Member m jpql select m from Member m 기본 규칙 엔티티나 속성에 관해서는 대소문자를 구별하지만 select, from 과 같은 키워드 문법에 대해서는 대소문자를 구별하지 않는다 from 절에는 클래스 명이 아닌 엔티티 명을 지정한다(@Entity(name="..
Spring - 로그인 처리 세션쿠키
쿠키 쿠키 종류 영속 쿠키: 브라우저가 종료되어도 설정된 만료 날짜 까지 유지 세션쿠키: 브라우저 종료시 까지만 유지 사용되는 곳 주로 로그인처리와 같은 사용자 상태를 유지하는 곳에서 사용이 된다 Cookie idCookie = new Cookie("memberId", memberId); HttpServletResponse.addCookie(idCookie); 쿠키는 위와 같이 얻어서 웹 응답 값에 포함 시켜서 응답을 보낸다 웹브라우저는 그 후 모든 요청에 쿠키 정보를 자동으로 포함하여 보낸다 Cookie cookie = new Cookie(cookieName, null); cookie.setMaxAge(0); response.addCookie(cookie); 쿠키를 없애고 싶으면 동일한 이름을 가진 쿠..