동적 쿼리를 해결하는 두가지 방식 BooleanBuilder BooleanExpression BooleanBuilder BooleanBuilder 생성자를 생성한후, where절 안에 들어갈 비교연산을 빌드로 한후 빌드 한 값을 넣어주기만 하면 된다. BooleanExpression where 조건에 null값은 무시됨. Reference 김영한의 실전 Querydsl
Querydsl Bean 생성(Bean population) 프로퍼티 접근 필드 직접 접근 생성자 사용 MemberDto 프로퍼티 접근 - Setter 프로퍼티로 접근할때는 Projections.bean(해당Dto.class, 적용할필드) 필드 직접 접근 필드값을 직접 바꾸는 필드 직접 접근은 Projcetions.fields(해당Dto.class, 적용할 필드) 생성자 사용 생성자를 사용할려면 Projcetion.constructor(해당Dto.class, 해당필드) @QueryProjection > DTO의 생성자에 이 어노테이션을 붙여주면 빌드시 DTO가 Q파일로 생성됨 사용할 때는 new QDto()이런식으로 생성자를 생성하듯 사용하면됨. 이 방법은 컴파일러로 타입을 체크할 수 있으므로 가장 안전한 방법. 다만 DTO에 QuertDSL어노테이션을 유지해야 하는 점과 DT
조인 - 기본 조인 기본 조인 , : 내부 조인(inner join) : left 외부 조인(left outer join) : right 외부 조인(right outer join) JPQL의 과 성능 최적화를 위한 조인 제공 -> 다음 on 절에서 설명 세타 조인 연관관계가 없는 필드로 조인 from 절에 여러 엔티티를 선택해서 세타 조인 외부 조인 불가능 -> 다음에 설명할 조인 on을 사용하면 외부 조인 가능 조인 - On절 > on절을 활용해 조인 대상을 필터링 할 때, 외부조인이 아니라 내부조인을 사용하면 where 절에서 필터링 하는 것과 기능이 동일하다. 따라서 on 절을 활용한 조인 대상 필터링을 사용할 때 내부조인 이면 익숙한 where 절로 해결하고 정말 외부조인이 필요한 경우에만 이 기능을 사용 연관관계 없는 엔티티 외부 조인 Reference [김영한의 실전 Quer
검색 조건 쿼리 검색 조건은 , 를 체인으로 연결 할 수 있다. AND 조건을 파라미터로 처리 에 파라미터로 검색조건을 추가하면 조건이 추가됨 이 경우 값은 무시 -> 메서드 추출을 활용해서 동적 쿼리를 깔끔하게 만들 수 있음 결과 조회 : 리스트 조회, 데이터 없으면 빈 리스트 반환 단 건 조회 결과가 없으면 : 결과가 둘 이상이면 : : 페이징 정보 포함, total count 쿼리 추가 실행 count 쿼리로 변경해서 count 수 조회 정렬 오름차순 : asc 내림차순 : desc nullLast : null은 정렬하고 마지막에 추가 nullFirst : null처음에 추가하고 정렬 null데이터에도 순서를 부여할 수 있다. 집함 GroupBy Reference [김영한의 실전 Querydsl](htt
1. JPQL JPQL은 JPA의 일부로 Query를 Table이 아닌 객체(=엔티티) 기준으로 작성하는 객체지향 쿼리 언어라고 정의할 수 있다. JPQL은 객체를 기준으로 모든 것이 움직이기 때문에 개발할 때, Table이 아닌 객체를 대상으로 검색해여 한다. > JPQL 특징 SQL을 추상화한 JPA의 Table이 아닌 를 대상으로 개발. Entity와 속성은 (PERSON person) 사용 필수 2. Query DSL > query DSL 정적 타입을 이용해서 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API Query DSL VS JPQL JPQL JPQL: 문자(실행 시점 오류) JPQL: 파라미터 바인딩 직접 Query DSL Querydsl: 코드(컴파일 시점 오류) Querydsl: 파라미터 바인딩 자동 처리
나의 Spring Boot project를 빌드/테스트 과정과 배포과정을 자동화 하기 위해 GitHub Action을 선택했다. Github Action을 통한 자동화는 너무 크게 어렵진 않았다. 하지만 고민거리가 하나 생겼다. application.properties이 파일을 어떻게 관리 할건지에 대해서 고민이 생겼다.빌드하기 위해선 Repository에 꼭 있어야 하는데 properties안에 내용들은 민감정보를 포함하기 때문에 생각을 많이 해야했다.그래서 내린 결론은 민감정보들을 다루는 많은 방법이 있지만 나는 GitHub의 secrets안에 application.properties내용들을 한번에 담고 빌드할때 application.properties를 만들고 secrets안에 담은 내용을 properties파일안에 넣어주는 방식으로 진행했다. 1. Settings의 secrets안에 key value형태로 만듬(value안에는 properties내용전부 담음) ![]
ORM 이란? > ORM은 Object-Relation Mapping의 약자로, 애플리케이션의 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 어플리케이션의 객체 SQL 데이터베이스의 테이블에 자동으로 영속화 해주는 기술. 장 단점 장점 생산성 쉽고 빠르게 매핑 정보만 정의만 하면 데이터를 다루는게 빠름. 유지보수성 코드가 간결. 코드에 로직만 보이게 됨. 성능 하이버네이트가 만드는 쿼리문이 우리가 직접 작성한 쿼리보다 느릴 수 있음. 하지만 하이버네이트에서는 성능 최적화를 위한 여러가지 기능을 제공함. 예를 들어, 캐시가 있음. 불필요한 쿼리를 매번 사용해 데이터를 불러내지 않고 한 번 불러낸 데이터를 캐시에 저장해 이후에 데이터가 필요할 때 캐시에 저장된 데이터를 내보내기 때문에 빠름.
CORS(Cross-Origin Resource Sharing) > CORS는 Cross-Origin Resource Sharing의 줄임말로, 교차 출처 리소스 공유를 의미하며, 교차 출처는 '다른 출처'라고 생각하면 이게하기 쉽습니다. 즉, 다른 출처 간의 자원을 공유하는 정책이라고 생각하면 됨. > Protocol, Host, Path, Query String, Fragment 구성 요소 중 출처(origin)는 Protocol과 Host, 그리고 :80, :443같은 포트번호까지 모드 합친 것을 의미한다. SOP(Same-origin policy) > CORS에 대한 개념을 이해하기 전에 SOP이 무엇인지 알아야함. SOP란 같은 Origin에만 요청을 보낼 수 있게 제한하는 보
Security Jwt Token / Refresh Token > Security와 Jwt Token / Refresh Token으로 회원가입과 로그인을 Api가 있습니다. 로그인 성공시 Access 토큰과 Refresh 토큰이 발급되고 Access 토근이 만료되면 Refresh 토큰의 값으로 Access 토큰과 Refresh 토큰을 재발급 합니다. 프로젝트 구조 버전 및 패키지 Spring Boot version '2.7.4' java 11 gradle Dependencies application.properties WebSecurityConfig
EntityManagerFactory는 여러 스레드에서 동시에 접근해도 안전하지만, 생성하는 비용이 상당히 크다. 따라서 EntityManagerFactory에서 요청이 올때마다 생성 비용이 거의 없는 EntityManager를 생성한다. (EntityManager는 Thread Safe하지 않아, 여러 스레드가 동시에 접근하면 동시성 문제가 발생한다 = 요청(스레드)별로 한개 씩 할당) 이때 만들어진 EntityManager는 내부적으로 Database Connection을 사용해서 DB를 사용한다. 영속성 컨텍스트란? -
프로젝트에서 하나의 엔티티를 삭제했을 때 이 엔티티와 연관된 다른 엔티티는 어떻게 될까? 나는 게시글을 삭제하였을때 댓글까지 삭제 한다는걸 생각하지 못하였다. Post(게시글)테이블에서 Comment(댓글)테이블을 참조 받고 있었는데 조회 하거나 수정하거나 할때는 오류가 나지 않았다. 하지만 게시글 삭제 API를 만들고 테스트를 하던도중 오류가 발생했다. Post Table |ID|title|conents|memberid|commentid| |:---:|:---:|:---:|:---:|:---:| Comment Table |ID|comment|postid|memberid| |:---:|:---:|:---:|:---:| 게시글 테이블에서는 멤버를 MnayToOne, 댓글을 OneToMany 로 참조 받고 있다. 여기서 Post테이블에서 게시글을 삭제 하였을때 그에 해당하는 댓글을 고려하지 않고 삭제해서 외래 키 무결성 에러가 발생했었다.
Spring MVC 구조 구성요소 DispatcherServlet 클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성 HandlerMapping 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정 Controller 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴 ModelAndView 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음. ViewResolver 컨트롤러의 처리 결과를 생성할 뷰를 결정 View 컨트롤러의 처리 결과 화면을 생성, JSP 또는
Spring Boot로 CRUD API를 구현하던중 update부분에서 Put하고 Patch의 차이를 더 알고싶어 구현해보았다. PUT과 PATCH 메서드는 기존에 존재하던 자원에 업데이트를 실시함. 둘다 업데이트를 실시하기 때문에 혼용해서 API를 구축하기 되게 쉽다. PUT HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체함. PATCH HTTP PATCH 메소드는 리소스의 부분적인 수정을 할때에 사용됩니다. 그래서 한번 JAVA Spring Boot로 PUT하고 PATCH의 업데이트 하는 부분을 구현해 보았다. DB Table : Blog title username password contents 테이블 안에 이렇게 값이 있고 어떻게 코드로 썻는지 보여주겠음.
CRUD API > 클라이언트가 서버에게 요청을 보낼때 크게 4가지로 분류할수 있습니다! Create = POST create는 서버에 정보를 올려달라는 요청임.create는 post를 통해 해당 URI를 요청하면 리소소를 생성함. Read = GET read는 서버에서 정보를 불러오는 요청. GET을 통해 해당 리소소를 조회후 해당 도큐먼트에 대한 자세한 정보를 가져옴. Update = PUT update는 정보를 바꾸는 요청. Delete = DELETE delete는 정보를 지우는 요청. DELETE를 통해 리소스를 삭제할 수 있음. JSON 서버에서 클라이언트로 데이터를 보낼 때 json 양식을 사용해 전달함. 직접해보기!! 프로젝트 구조 controller PersonController.java
JSON 형태의 객체 데이터를 주고 받기!! 1. controller이라는 패키지를 만든다. 2. Course 라는 클래스를 만든다. Course데이터를 주고받을 Controller 클래스를 하나 만든다. 소스코드 @RestController @Controller에 @ResponseBody가 결합된 어노테이션입니다! RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON등을 전송할 수 있읍니다! @GetMapping localhost:8080/ -> 이뒤에오는 주소값으로 입력을 받아서 함수를 실행 시킴!! GET방식으로
오늘은 Getter와 Setter에 대해 알아보자! Getter / Setter Getter 멤버 변수의 값을 조회 하기 위한 메서드! get멤버변수명()의 형식으로 명령 객체변수.get멤버변수명()의 형식으로 사용 Setter 멤버 변수에 값을 활당하기 위한 메서드 set멤버변수명(파라미터)의 형식으로 명령 객체변수.set멤버변수명(파라미터)의 형식으로 사용 > 지금 이렇게 위에보면 어떤소리인줄 모를수 있다!! 그래서 하나하나 살펴보자! 멤버 변수(private variable) Private 멤버변수는 Class 외부에서 접근할 수 없는 변수를 의미함!! ![](https://velog.velcdn.com/images/sun1203/post/8f429cb6-8e35-429e-bccb-543984
오늘 Spring Boot JPA로 관계형 데이터베이스를 공부하고 있었다!! 하지만 어김없이 뜨는 오류내용을 발견하였다. 그래서 그 오류 내용을 어떻게 해결했는지 보여주겟습니다! 이런 오류가 뜬것이다. 16번째 라인에 annotation ID를 선언하고 위에서 import 할때 문제가 생긴것 같았다. import org.springframework.data.annotation.Id; > #### JPA와 같이 정의된 공통 지속성 API가 없는 다른 비관계형 지속성 데이터 베이스 또는 프레임워크에 대한 매핑을 지원하기 위해 현재 Spring에서 사용됩니다. 라고 나와있다!! 간단하게 이야기하면 몽고디비와 같은 NoSql을 사용할때 이렇게선언한다. import javax.persist