CS/김영한 스프링 강의

    스프링 부트 - 핵심 원리와 활용 - 섹션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 어노테이션을 사용하는 것. 이걸 사용하려면..

    실전! Querydsl - 섹션3. 기본 문법

    기본 @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, t..

    실전! Querydsl - 섹션2. 예제 도메인 모델

    예제 도메인 전에 querydsl 설치는 현재 사용하는 spring boot 버전 검색해서 하면 그나마 잘 나온다.. 종속성 보면 qclass 만들어주는 apt 라이브러리와 실제 select등 함수 도와주는 jpa 라이브러리가 있다. 설정 파일에 querydsl 관련 설정 해준건 플러그인 때문에 그렇다. sql문도 추적하기 위헤 p6spy를 깐다.. 이제 섹션2 예제 도메인 모델

    실전! 스프링 데이터 JPA - 섹션7. 나머지 기능들

    나머지 기능들인 이유는 잘 안써서. 가끔 유용하게 쓰는 정도 - Specifications (명세) - Query By Example - Projections - 네이티브 쿼리 Specifications은 JPA Creteria인데 사용 금지. QueryDSL을 써라. query by example은 새로 생긴 data-jpa의 기능임. 객체를 넘겨줘서 찾는다. join을 하고싶으면 join을 하는 걸 같이 넣어줘야 한다. 또 null이 될 수 없는 기본 타입은 0이 되기 때문에 이건 무시하라고 조건을 내보내야 함. Projections 프로젝션 엔티티의 특정 속성만 불러오고 싶다면? 원래는 일단 객체 전체를 sql문으로 가져와서 그것을 가져오는 형식으로 했지만 원하는 속성 부분만 sql문 써서 가져오게..

    실전! 스프링 데이터 JPA - 섹션6. 스프링 데이터 JPA 분석

    JpaRepository를 사용하면 안의 실제 구현물은 어떤지 보는 시간 이런 findById니 findOne... 인 어쩌구 하는것들도 직접 EntityManager를 가져와 구현했듯이 다 똑같은 것들이다. 재밌는건 jpa에서 카운트 같은걸 자체 지원하지 않기 때문에 나름내로 알아서 sql문으로 구현한 모습 어노테이션이 @Repository와 @Transactional 두가지가 있는데 각각의 의미는 다음과 같다. @Repository는 안에 @Component가 있기 때문에 스프링한테 이걸 bean에다가 넣으라는 의미도 있지만, repository는 각각의 db들이 서로 실제 명령어들도 다르고 에러도 다르게 뜰 텐데 @Repository가 이걸 받아 일정한 에러로 변환시켜준다. @Transactiona..

    실전! 스프링 데이터 JPA - 섹션5. 확장 기능

    자기가 원하는 기능을 data jpa repository interface에서 더 추가해서 사용할 수 있다. 자기만의 인터페이스를 만들고, 이 인터페이스의 구체적 클래스 + Impl를 작성하고(관례 규칙. 이게 있어야 스프링에서 가져감) jpa repository에서 이 인터페이스를 확장하는 것이다. 이렇게 뺄 정도의 복잡한 쿼리인데 핵심 비즈니스와 그다지 관련없는 쿼리라면 따로 레포지토리를 만들어 구조적으로 해결하는 방법도 있다. 어느게 더 좋을지는 본인 선택임. db에서 해당 row가 언제 생성되었고 수정되었는지를 표시하는 만들어진 시간, 업데이트된 시간을 표시하는걸 audit이라고 함. 당연히 다른 곳들에서도 많이 쓰이므로 @Audit도 지원한다. 원래 db로만 있을 땐 상속 개념이 없어 각 테이블..