전체 글

전체 글

    스프링 부트 - 핵심 원리와 활용 - 섹션6. 외부설정과 프로필1

    .jar 파일로 빌드해서 서버에 올리는걸 해봤는데, 같은 코드지만 개발용 서버, 라이브 서버에 따라 안에 들어있는 ip주소 값 등은 바뀌어야 한다. 옛날엔 이런 기능이 없어서 해당 변수만 살짝 바꿔서 빌드하는 방식으로 2번 빌드했다. 하지만 이젠 아니다. 같은 코드에서도 다른 변수를 주입하게 하려면, 코드 내에서 외부 파일을 읽어와 이걸 변수에 할당하는 방법이 있다. 그래서 외부 설정이라고 하는거고, 외부 파일을 읽어들여 사용한다. 위 처럼 크게 4가지 방법이 있다는데 3가지 방법을 알아볼거다. 일단 os 환경변수 위 환경변수를 가져오는걸 자바에서 제공해준다. 하지만 이건 말 그대로 os 속성이라 다른 프로그램에서도 사용할 수 있다. 그래서 자바에서만 사용가능하게 하는 자바 시스템 속성을 보자. 실행할 ..

    스프링 부트 - 핵심 원리와 활용 - 섹션5. 자동 구성(Auto Configuration)

    새 프로젝트로 다시 시작해본다. 데이터베이스랑 연동하는걸 직접 bean으로 등록하며 해보자. 코드 내에서 직접 db관련해서 DataSource, TransactionManager, JDBCTemplate 모두 등록한다. 레퍼지토리에서 이걸 가져와서 쓴다. 사실 DbConfig로 작성한 db등록 내용들은 매 프로젝트 생성시마다 해줘야 하는 반복작업이다. 그래서 자동구성이 있다. 일단 테스트를 만들어 자동구성 안하는것과 하는거 차이를 보자. 내가 만든 @Configure가 실행되서 내가 만든 로그가 뜨는거다. 근데 내가 만든걸 없애도 자동 구성으로 알아서 주입되어있다. 자동 구성은 부트를 쓴다면 왠만하면 있다. 안의 등록 로직은 내가 직접 짠거랑 거의 비슷한 것이 핵심이다. @ConditionalOnClas..

    23.10.24~23.11.01 일본여행 정리 및 일기

    23.10.24~23.11.01 일본여행 예산 정리 여행 전 사용 예산 비행기 티켓 + 한달 반 전 예약 + 저녁시간대 (8시 출발 ~ 10시 도착) - ANA 항공 - 김포 하네다 공항 -> 454,900원 숙박 https://www.expedia.co.kr/Tokyo-Hotels-Tokyo-Ariake-Bay-Hotel.h12980413.Hotel-Information 1박(10월 24일(화)): 캡슐호텔 35,984원 (시노노메역, 고토구) https://www.agoda.com/ko-kr/grids-tokyo-ueno-hotel-hostel_2/hotel/tokyo-jp.html 2박(10월 25일(수) ~ 10월 27(금)): 게스트하우스 114,858원 (우에노역, 다이토구) https://w..

    스프링 부트 - 핵심 원리와 활용 - 섹션4. 스프링 부트 스타터와 라이브러리 관리

    새로 프로젝트를 시작하자 처음부터 하나하나 깔 때 라이브러리들이 버전이 달라 호환이 안된다던가 하는 세팅에서 피곤함을 느낄 수 있다. 그래서 부트가 좀 지원해준다. 일단 버전 관리 자동으로 하는것부터. io.spring.dependency-management가 있다면 라이브러리 버전을 생략해도 이미 검증된 호환 버전을 찾아 알아서 찾아 설치한다. spring-boot/spring-boot-project/spring-boot-dependencies/build.gradle at main · spring-projects/spring-boot · GitHub 위 링크의 bom을 참고함. 스프링 버전에 따라서 이미 검증해놓았다. 또 직접 확인하는 것도 스프링 공식 문서에 있음. Dependency Versions..

    스프링 부트 - 핵심 원리와 활용 - 섹션3. 스프링 부트와 내장 톰캣

    웹 애플리케이션 서비스를 줄여서 WAS라고 부르는데, 서버를 실행하기 위해선 웹 애플리케이션 서버 설치하고, 여기에 빌드해서 나온 파일 WAR를 올리고 실행해줘야 해서 여기에 불편함을 느끼는 사람이 많았다. 그래서 어차피 톰캣도 자바로 만들었으니 그냥 라이브러리처럼 내장하면 되는거 아닌가? 해서 진짜 안에다가 넣었다. 이제 main 메소드만 실행해도 톰캣 서버가 알아서 실행된다. 따로 설치할 필요가 없음. 이제 스프링도 연동해보자. 컨테이너 만들고 이 컨테이너를 디스패처 서블릿 만들어서 연결하고, 이 디스패처 서블릿을 톰캣에 연결한다. 이걸 실제로 운영하려고 웹 서버에 올리려고 한다. 그럼 앞서 해봤던 빌드해서 나온 걸 서버에 올리면 될거다. 빌드는 gradle에서 설정하여 만들자. 물론 jar를 실행하..

    스프링 부트 - 핵심 원리와 활용 - 섹션2. 웹 서버와 서블릿 컨테이너

    예전엔 스프링 실행하려면 서버를 만들고 빌드해서 나온 war 파일을 이 서버 위에 올려서 실행하는 거였다. 근데 부트가 나오면서 서버가 안으로 들어가 빌드해서 나온 jar 파일을 실행하기만 하면 즉, 그냥 main() 실행하면 알아서 안에 서버가 실행되고 빌드한 코드가 실행된다. 이렇게 자동으로 부트가 해주는 원리를 이해하기 위해 부트 없이 쌩으로 해보는거다. 톰캣을 다운받고 정말 boot가 아닌 종속성이 아무것도 없는 형태의 프로젝트를 실행한다. plugins로 war가 있어서 파일을 빌드한 뒤 나온 war를 톰캣에다가 줄거다. hello world를 보기위한 최소한의 코드만 작성해보자. 이제 빌드해서 war파일을 만든다. 그럼 플러그인에 war가 있기 때문에 war가 빌드 결과로 나온다. 압축을 풀 ..

    스프링 부트 - 핵심 원리와 활용 - 섹션1. 스프링 부트 소개

    섹션 0 섹션1 소개 스프링 프레임워크는 좋으나 점점 살이 붙으며 설정 자체가 어려워지게된다. 그래서 이걸 도와주는 스프링 부트가 2014년부터 생겨서 거의 필수가 됨.

    실전! Querydsl - 섹션6. 실무 활용 - 스프링 데이터 JPA와 Querydsl

    이제 순수 JPA대신 스프링 데이터 JPA와 querydsl를 같이 사용해본다. 커스텀해서 사용하려면 인터페이스다보니 좀 복잡하게 해야 한다. 주의할 점은 꼭 커스텀하고자 하는 인터페이스 이름 + Impl을 할 것. 스프링 규칙임. 페이징도 해보자. 간단하게 기본으로 주어지는거 사용하는것도 있고 직접 좀 해주는것도 있다. 기본으로 해주는거 Pageable로 해서 가져오면 count용 쿼리 한번 더 날리는거 생각하자. 복잡하게 total을 직접 정의하는 이유는, 기본으로 주어진 걸 쓰면 단순 total count 계산할 때도 join같은걸 하기 때문에 직접 정의하여 안하도록 최적화 하는거임. 아니면 첫 페이지가 끝이거나 마지막 페이지일 경우 총 total이 필요 없기 때문에 count를 날릴 필요가 없다...

    실전! Querydsl - 섹션5. 실무 활용 - 순수 JPA와 Querydsl

    이제 실제로 해볼거다 되는거 봤으니 이제 querydsl로 바꿔보자 JPAQueryFactory 생성하는거는 클래스 안에서 생성하거나 외부에서 생성하고 bean에 등록해서 주입받아 사용하거나 하면 된다. 선택의 문제임. 근데 외부에서 주입하는거면 하나의 인스턴스만 가지고 있는거일 텐데 멀티쓰레딩의 문제는 없냐? 없다. 트랜잭션 단위마다 실제로 생기는게 아니라 프록시가 생겨서~~~ 어쨌든 고민 안해도 된다. 자세한건 나중에 배우는 듯. 이제 동적쿼리를 해보자. 우선 builder 사용하기. 이제 함수 만들어 사용해보기 단 둘 다 동적쿼리일 때의 주의점은 where에다가 조건을 걸었으므로 모든 조건이 null이면 where가 없으니 그냥 from에 있는거 모두 불러온다. 그래서 느려질 수 있으므로 따로 조치..

    실전! Querydsl - 섹션4. 중급 문법

    이제 프로젝션 대상이 여러개인걸 해볼거다. select해서 받는거 여러개. 3개 이상부터 자주 쓰인다. 3개 이상부턴 보통 dto로 만들어서 처리하는 듯. jpql로 하면 저렇게 좀 길어지지만 querydsl로 하면 깔끔해진다. 근데 이것도 querydsl이 불러오는 방법이 3가지가 있는데, bean, fields, construct다. bean는 비어있는 생성자 사용, fields는 생성자 없이 그냥 필드 변수 바로 뿌려주고 (private로 되어 있어도 라이브러리가 뚫음), construct는 매개변수 있는 생성자 사용한다. 서브쿼리에서도 가능. 값이 비어있다면 as를 사용하자. 사실 저렇게 할 필요 없는 궁극의 방법이 있는데, @QueryProjection 어노테이션을 사용하는 것. 이걸 사용하려면..