Http 요청정보 로그 남기기 logging.level.org.apache.coyote.http11=debug 업로드 파일 데이터 크기 제한 spring.servlet.multipart.max-file-size=2MB #하나의 파일 최대 크기 spring.servlet.multipart.max-request-size=5MB #전체 보내는 파일의 총 크기 제한 첫 요청 시 SessionId 제외하기 server.servlet.session.tracking-modes=cookie 📔 Reference 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, ..
오늘 공부한 내용 [실전! QueryDSL] 듣기 [백기선님의 스프링 시큐리티] 스프링 시큐리티: 폼 인증 듣기 스프링 시큐리티 공식문서 번역하기(아오 이거 최신버전 말고 옛날버전 번역해서 다시해야해 ㅜㅠㅠ) [이것이 취업을 위한 코딩 테스트다] 음료수 얼려 먹기 문제 다시 풀기 [Modern Java in Action] 메소드 참조식 전까지 복습하여 정리 💭느낀 점 & 배운 점 [실전! QueryDSL]을 모두 들으려 했으나, 마지막 부분은 너무 어려웠고, 실전에서 그닥 쓸만하지 못하다고 하셔서 일단 넘겼다.. 지금 다른것도 너무 할게 많고 아직 이것저것 모르는게 많은데, QueryDSL을 그렇게까지 깊게 팔 이유가 아직 없어보였기 때문이다.. 공식문서 초반 아키텍처 부분을 한번 읽어보고(물론 살짝 예..
QueryDSL에서 동적 쿼리 사용하기 QueryDSL에서 동적 쿼리를 사용하는 방법은 다음과 같습니다. BooleanBuiilder 사용 Where 다중 파라미터 사용 (권장) BooleanBuilder @Test @DisplayName("BooleanBuilder 를 사용한 동적쿼리") fun testBooleanBuilder() { //given var usernameParam = "member1" var ageParam = 10 val result: List = searchMember1(usernameParam, ageParam) assertThat(result.size).isEqualTo(1) } private fun searchMember1(usernameCond: String?, ageCon..
프로젝션 프로젝션은 select절에 대상을 지정하는 것입니다. 프로섹션 대상이 하나인 경우, 둘 이상인 경우, DTO로 조회하는 경우에 대한 방법이 모두 다르기에 하나하나 예시를 동해 알아가보도록 하겠습니다. 그전에 우선 프로젝션을 사용할 때 가장 권장되는 방법인 @QueryProjection의 사용법부터 알아보겠습니다. @QueryProjection @QueryProjection은 생성자를 통해 DTO를 조회하는 방법과 함께 사용됩니다. DTO의 생성자에 @QueryProjection을 붙여주어야 합니다. data class MemberDtoQueryProjection @QueryProjection constructor( val username: String, val age: Int, ) 이후 빌드 ..
오늘 공부한 내용 [자바 ORM 표준 JPA 프로그래밍] 15장 고급 주제와 성능 최적화 - 예외 처리 공부 모여서 각자 코딩 블로그 개설(사실 이건 공부는 아니고.. 그래도 시간 많이 잡아먹혔다) [실전 QueryDSL] 기본 문법 듣기 [Modern Java in Action] 메소드 참조식부터 공부 [이것이 취업을 위한 코딩 테스트다] BFS/DFS 공부 - 음료수 얼려 먹기 문제 풀기 [오브젝트] 8장까지 읽기 💭느낀 점 & 배운 점 아 15장을 사실 한번 다 읽긴 했는데, 이후 내용들이 너무 어려워서 아직 거기까지 할 단계는 아닌 것 같다. 조금 다른 것들도 공부를 한 다음에 다시 돌아와서 깊숙히 공부할 때 제대로 확인해야 할 것 같다. 확실히 QueryDSL은 간편하고 별로 어렵지 않았다. 그..
상수 상수가 필요한 경우 Expressions.constant(상수)를 사용합니다. 예시 /** * 상수 * Expressions 사용 */ @Test fun testConstant() { //given val fetch = query .select(member.username, Expressions.constant("A")) .from(member) .fetch() fetch.forEach { println(it) } } 결과는 다음과 같습니다. 문자 더하기 결과에 문자열을 더하고 싶은 경우에 다음 메서드를 사용할 수 있습니다. concat() : 문자열 뒤에 이어서 더합니다. prepend() : 문자열의 맨 앞에 더합니다. /** * 문자 더하기 * concat * 앞에 더할때는 prepend */..
CASE문 select, 조건절(where), orderBy 에서 사용할 수 있습니다. 단순한 조건 /** * (DB가 아니라 애플리케이션에서 하는것을 추천) * Case 문 */ @Test fun testCase() { //given val fetch = query .select( member.age .`when`(10).then("열살") .`when`(20).then("스무살") .otherwise("기타") ) .from(member) .fetch() fetch.forEach { println(it) } } 복잡한 조건 - CaseBuilder 사용 /** * 복잡한 Case 문 * CaseBuilder 사용 */ @Test fun complexCase() { //given val fetch = ..
서브쿼리 JPAExpressions을 사용하여 처리합니다. JPQL과 마찬가지로 from절의 서브쿼리는 지원되지 않습니다. 단 하이버네이트 구현체를 사용하면 select절의 서브쿼리를 사용할 수 있습니다. 주의 사항 서브쿼리와 메인쿼리의 별칭이 겹치면 안되므로, 같은 엔티티를 사용한다면, QType을 생성할 때 Alias를 직접 지정해주어야 합니다. from절의 서브쿼리 해결방안 서브쿼리를 join으로 해결한다.(가능할수도, 불가능할수도 있습니다) 애플리케이션에서 쿼리를 2번 분리해서 실행합니다. nativeSQL을 실행합니다. 사용 예시 /** * 서브 쿼리 * com.querydsl.jpa.JPAExpressions 사용 * * 나이가 가장 많은 회원 조회 */ @Test fun testSubQuer..