동적 쿼리를 해결하는 두가지 방식 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내용전부 담음) ![]
Date / Calendar Date 특정 시점의 날짜를 표현하는 클래스. Date 객체 안에는 특정 시점의 연도 월, 일, 시간 정보가 저장됨. Calendar 달력을 표현한 클래스. 해당 운영체제의 Calendar 객체를 얻으면, 연도, 월, 일, 요일, 오전/오후, 시간 등의 정보를 얻을 수 있음. Date 클래스 사용 예제 Calendar 클래스 사용 예제
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
익명객체 > 클래스를 선언할 때 일반적으로 클래스 이름과 동일한 소스 파일을 생헝하고 클래스 선언합니다. 한번 선언해놓고 여러 곳에서 객체를 만들어 사용하고 싶을 때 간단히 클래스 이름으로 생성자를 호출할 수 있기 때문입니다. 그런데 클래스 이름이 없는 객체도 있습니다. 이것을 익명(annoymous)객체라고 합니다. 익명 자식객체 (extends) 일반적인 상속을 이용한 객체 사용법 자식 객체가 일회성이라면? > 다형성을 위해 부모 타입으로 필드나 변수를 선언하고, 자식 객체를 초기값으로 대입하는 경우 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우라면 (일회용) 익명 자식 객체를 생성해서 초기값으로 대입하는 것을 권장합니다. 익명 자식 객체 생성 일반 클래스와으 차이점은 익명 자식 객체는 생성자를 선언할 수 없습니다. 익명 자식 객체에 새롭게 정의된 필드와 메소드는 익명 자식 객
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테이블에서 게시글을 삭제 하였을때 그에 해당하는 댓글을 고려하지 않고 삭제해서 외래 키 무결성 에러가 발생했었다.
예외처리(Exception) > 프로그램을 만들다 보면 수없이 많은 오류가 발생한다. 물론 오류가 발생하는 이유는 프로그램이 오동작을 하지 않기 하기 위한 자바의 배려이다. 하지만 때로는 이러한 오류를 무시하고 싶을 때도 있고, 오류가 날 때 그에 맞는 적절한 처리를 하고 싶을 때도 있다. 이에 자바는 try...catch, throw구문을 이용해 오류를 처리한다. 예외 발생 시키기. 이렇게 10을 0으로 나눌려고 하면 예외가 발생한다. 자바는 이와 같은 예외가 발생하면 프로그램을 중단하고 오류 메세지를 보여준다. 예외 처리하기. try : try는 예외가 발생할 것 같은 부분을 try로 감싸준다. catch : try문에서 예외가 발생했다면 catch문으로 넘어가 catch문이 수행된다. finally : 예외가 발생하든 예외가 발생하지 않든 finally문은 무조건 실행된다. 실행 결과 메소드를 이
Spring MVC 구조 구성요소 DispatcherServlet 클라이언트의 요청을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성 HandlerMapping 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정 Controller 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴 ModelAndView 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담음. ViewResolver 컨트롤러의 처리 결과를 생성할 뷰를 결정 View 컨트롤러의 처리 결과 화면을 생성, JSP 또는
상속(Inheritance) 우리가 생각하는 상속이라는 단어가 맞다. 현실 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 차이라고 하면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부른다. 상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 한다. ParentBook 이라는 부모 클래스가 있고 ChildBook라는 자식클래스가 상속받아서 생성자의 name하고 price는 부모클래스에서 상속받아 사용한다. 부모생성자의 호출 Super 만일 부모에게 매개변수를 포함한 명시적 생성자 선언이 있었는데, 자식 생성자에서 super 를 통하여 호출해주지 않았을 경우 컴파일 에러가 납니다. 또한, 앞에서도 말했다시피 반드시 자식 생성자 내부의 첫 줄에 super(…..); 를 써야만 컴파일 에러가 나지 않습니다. 메소
자바빈즈(Java Beans)는 자바(Java)로 작성된 소프트웨어 컴포넌트를 일컫는 말로 데이터 표현을 목적으로하는 자바 클래스다. 자바 빈즈 클래스는 'Java Beans Convention'을 지켜야 하며, Java Beans Convention은 다음과 같다. 클래스는 인자(Argument)가 없는 기본 생성자(Default constructor)를 갖는다 클래스의 멤버 변수는 프로퍼티(Properties)라고 하며 private 접근 제한자를 가져야 한다. 클래스의 프로퍼티들은 Getter/Setter를 통해 접근할 수 있어야 한다 Getter의 이름은 get{프로퍼티 이름} 이며, Setter의 이름은 set{프로퍼티 이름}이다 Getter/setter의 접근 제한자는 public이어야 한다. 프로퍼티의 타입이 Boolean인 경우 is로 시작할 수 있다 Getter의 경우 파라미터가 존재하지않아야 하며, setter의 경우 하
인스턴스 멤버란? > 인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부름. 인스턴스 필드와 메서드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없음. 인스턴스 메서드 선언 출력 위에 출력코드 보면 인스턴스 필드와 메서드는 인스턴스화해서 객체를 하나 만들어서 사용해야한다. 정적 멤버란? > 정적은 고정된이란 의미. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 메소드를 말함. 이들을 각각 정적 필드 정적 메서드라고 함. 정적 멤버 선언 출력 코드 출력코드와 같이 정적 메서드와 필드는 클래스 이름으로 접근해서 객체를 따로 만들지 않고 사용할 수 있다.하지만 객체 참조 변수로도 접근이 가능함. 정적 메소드 선언시 주의할점 객체가 없어도 실행된다는 특징 때문
싱클톤? 객체의 인스턴스가 오직 1개만 생성되는 패턴. 싱글톤을 왜 사용? 고정된 메모리 영역을 얻으며 생성된 인스턴스를 계속 사용하기 때문에 메모리 낭비를 방지할 수 있으며, 생성된 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기가 쉽다고 한다. 사용 및 예제 출력 참고자료 및 싱글톤의 문제점과 다른 해결 구현
Http Servlet Request Servlet은 개발자가 Http요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP요청 메세지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다. HTTP 요청 방법 GET - 쿼리 파라미터 /uri?username=lee&age=26 메세지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달. 검색, 필터등에서 많이 사용함. POST - HTML Form username=lee&age=26 메세지 바디에 쿼리 파라미터 형식으로 전달 Http message body HTTP API에서 주로사용 주로 JSON형식으로 주고받음. HTTP GET 쿼리 파라미터 request 요청 : localhost:808