전체 글

개발 일지
아래 세가지 지원 기능은 제약이 커서 복잡한 실무 환경에서의 사용은 선택적으로! 1. 인터페이스 지원 - QuerydslPredicateExecutor Pageable, Sort 지원 // 리포지토리에 적용 public interface MemberRepository extends JpaRepository, CustomMemberRepository, QuerydslPredicateExecutor { ... } // 서비스에서 사용 Iterable result = memberRepository.findAll( member.age.between(10, 40) .and(member.username.eq("1"))); 한계 외부 조인 불가능 (묵시적 조인 가능) 클라이언트가 Querydsl 구현기술에 의존 2...
스프링 데이터 JPA 리포지토리로 변경 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } 테스트 @SpringBootTest @Transactional class MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest() { Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberReposit..
순수 JPA 리포지토리와 Querydsl 스프링이 주입하는 em은 실제 동작 시점에 트랜잭션 단위로 진짜 엔티티 매니저를 찾아주는 프록시 엔티티 매니저임 JPAQueryFactory를 메인 어플리케이션 클래스에 Bean으로 등록하고, 리포지토리에서 주입받아도 됨 장점: @RequiredArgsConstructor 활용해 리포지토리 코드 짤 때 깔끔함 단점: 두 개를 주입받아야 하므로 테스트코드 짤 때 불편함 @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return new JPAQueryFactory(em); } 리포지토리 @Repository public class MemberJpaRepository { private final EntityMan..
* F2: IntelliJ 오류난 곳으로 바로 이동 프로젝션과 결과 반환 - 기본 프로젝션: select 대상 지정 튜플은 querydsl 종속적인 자료형이기 때문에 repository 계층이 아닌 controller나 service 단에서는 사용 지양 다른 계층으로 넘길 때는 DTO 사용 권장 // 프로젝션 대상 하나 @Test public void simpleProjection() { List result = queryFactory .select(member.username) // 이름만 지정 .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } // 프로젝션 대상 여러개 @Test public voi..
기초 설정 스프링, Querydsl 버전에 따라 설정하는 법이 계속 바뀜 강의 수강 시점에서의 설정 방법: https://www.inflearn.com/chats/669477 Q파일은 gitignore Q타입 생성 확인 후 테스트 케이스로 실행 검증 h2 설치 및 설정 -> sql 로그 출력, 쿼리 파라미터 로그 출력(운영 단계에서는 성능 테스트하고 사용) # application.yml spring: profiles: active: local datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create proper..
경로 표현식 .(점)을 찍어 객체 그래프 탐색 상태 필드: 단순히 값을 저장하기 위한 필드 예: m.username 연관 필드: 연관관계를 위한 필드 단일 값 연관 필드: 대상이 엔티티, @ManyToOne, @OneToOne 예: m.team 컬렉션 값 연관 필드: 대상이 컬렉션, @OneToMany, @ManyToMany 예: m.orders 특징 상태 필드: 경로 탐색의 끝, 더 이상 탐색 불가 예: select m.username, m.age from Member m 단일 값 연관 경로: 묵시적 내부 조인 발생, 더 탐색 가능 예: select o.member from Order o 탐색 시 자바로는 .(점)만 찍으면 되기 때문에 편하지만 db에서는 조인이 일어나므로 사용 지양 컬렉션 값 연관 경..
소감 수료식을 끝으로 캠프가 공식적으로 마무리되었다. 사실 아쉬움이 굉장히 많은 캠프였다. 스스로한테 가장 그렇고, 캠프 운영 관련해서도 그렇고, 팀원에게 아쉬운적도 있는 캠프였다. 그래도 나름 재밌는 경험이었고, 게더에 접속하지 않는 것은 벌써 적응하긴 했는데, 시원섭섭하긴하다. 내가 더 열심히 했으면 훨씬 더 의미있고 가져갈게 많았을 시간이었지만, 어쨋든 이건 내 탓이고, 졸업하자마자 좋은 부트캠프 잘 마무리해서 좋다. 3개월이 너무 빨리 지나갔다. 모의면접 모의지만 이런 면접경험은 처음이었다. 사실 분위기는 멘토링과 좀 흡사한, 실제 면접보다는 더 부드러운 분위기이지 않을까 조심스럽게 예상해보고 있다. 이력서를 기반으로 대체로 기술적인 부분을 질문주셨다. 간단한 자기소개, SSE와 WebSocket..
문법예) select m from Member as m where m.age > 18엔티티와 속성은 대소문자 구분 (Member, age)JPQL 키워드는 대소문자 구분 X (select, from, where)엔티티 이름 사용 (테이블명 X)별칭 필수 (m), as 생략 가능집합과 정렬TypeQuery, QueryTypeQuery: 반환 타입 명확할 때Query: 반환 타입 명확하지 않을 때 TypedQuery q1 = em.createQuery("select m from Member as m where m.age > 18", Member.class); Query q2 = em.createQuery("select m.username, m.age from Member as m where m.a..
@JsonBackReference @JsonManagedReference 꽤 중요한 어노테이션을 배웠다. 항상 양방향 연관관계를 맺은 엔티티끼리 순환참조되어 json 파싱 오류가 나면 필요없다고 판단되는 쪽에 @JsonIgnore로 해결해왔었는데, 이 순환참조 문제를 위한 어노테이션이 따로 있었음을 알았다. @JsonIgnore는 항상 응답에서 아예 제외되기 때문에 나중에 프로젝트가 확장됨에 따라 부작용이 생길 수 있을 것이다. 사용방법은 간단하다. 일대다 관계라고 하면, 일(부모) 쪽에 @JsonManagedReference를 달고, 다(자식) 쪽에 @JsonBackReference를 달면 끝이다. 이 순환참조 문제가 Member -----------1:N-------------- MemberAchie..
1. 트러블 슈팅 세션 기술용어 습득 -> 개발자 소통 프로젝트 진행하면서 익숙한 부분부터 CS 공부(웹 기술) -> 점차 확장 트러블 슈팅의 각 요소(도입 이유, 문제 상황, 해결 방안, 의견 조율, 의견 결정) 명확히 제시 a를 통해 b의 결과가 나타남 a가 무엇이고(개념), 왜 사용 했는지 b가 무엇이고, a로 인해 b 이외의 부작용은 없는지 테스트한 내역도 있으면 좋음 isolation 터널비전 피하는 전략 페어 프로그래밍 디버깅 시간 정해놓기 팀원과 공유 중간 회고 더 나은 방법은 없었나 최종 회고 2. 파이썬 스케줄러 스프링으로 수익률 계산 로직을 고민하던 중에, 현재 파이썬으로 스케줄러를 이용해 짧은 시간마다 갱신하는 방식이 좋지 않을 수 있겠다는 생각이 들었다 레디스를 활용한 현재가 정보나..
hjkim0502
CODELOG