728x90

전체 글 331

Spring Data Redis로 Redis와 연동하기

Redis가 타 캐시 시스템(ex. MemCache 등)과 다른 특징은 아래와 같습니다. Redis는 List, Set, Sorted Set, Hash 등과 같은 Collection을 지원합니다. Redis는 Single Thread → 따라서 Atomic 보장 persistence를 지원하여 서버가 꺼지더라도 다시 데이터를 불러들일 수 있습니다. Redis의 주요 사용처 Remote Data Store 여러 서버의 Data 공유를 위해 사용될 수 있습니다. 특히, Redis의 경우 Single Thread 이므로 Race Condition 발생 가능성이 낮다는 것을 활용할 수 있습니다. 인증 토큰 개발 Ranking Board (Sorted Set) Job QUEUE 등 Redis Template을 S..

Redis 2022.02.15

th:text DTO 활용 예제

- 데이터를 주고 받을 때는 Entity 클래스 자체를 반환하면 안되고 데이터 전달용 객체(DTO)를 생성해서 사용해야 한다. @GetMapping(value = "/ex02") public String thymeleafExample02(Model model){ ItemDto itemDto = new ItemDto(); itemDto.setItemDetail("상품 상세 설명"); itemDto.setItemNm("테스트 상품1"); itemDto.setPrice(10000); itemDto.setRegTime(LocalDateTime.now()); model.addAttribute("itemDto", itemDto); return "thymeleafEx/thymeleafEx02"; } @Getter @..

Thymeleaf 2022.02.14

페치 조인(fetch join) 의 활용

(JPA) 페치 조인(fetch join) 의 활용 JPQL에서 성능 최적화를 위해 제공하는기능입니다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다. join fetch 명령어를 사용합니다. 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교) /** * V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) * - 단점: 지연로딩으로 쿼리 N번 호출 */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(t..

JPA 2022.02.14

회원등록 API v1, v2 차이

회원등록 API v1, v2 차이 비교 회원등록 V1: 요청 값으로 Member 엔티티를 직접 받습니다. 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가됩니다. 엔티티에 API 검증을 위한 로직이 들어갑니다. (@NotEmpty 등등) 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵습니다. 엔티티가 변경되면 API 스펙이 변합니다. 결론 - API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 따로 생성하여 받는것이 좋습니다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){..

JPA 2022.02.14

변경 감지(dirty check)와 병합(merge)

(JPA)변경 감지와 병합(merge) 엔티티를 수정하는 2가지 방법으로 변경 감지(dirty checking)와 병합(merge)이 있습니다. 변경 감지 기능 사용 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법입니다. 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 트랜잭션 커밋 시점에 변경 감지(Dirty Checking) 이 동작해서 데이터베이스에 UPDATE SQL 실행합니다. @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.setP..

JPA 2022.02.14

스프링 부트 Test 예제(feat. assertj)

스프링 부트 Test 예제 @RunWith(SpringRunner.class) @SpringBootTest @Transactional @Rollback public class OrderServiceTest { @PersistenceContext EntityManager em; @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void 상품주문() throws Exception { //Given Member member = createMember(); Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고 int orderCount = 2;..

Spring 2022.02.14

(Querydsl) ON 절을 활용한 조인

(Querydsl) ON 절을 활용한 조인 /** * 예) 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 조회 * SQL: SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='teamA' */ @Test public void join_on_filtering() throws Exception { List result = queryFactory .select(member, team) .from(member) .leftJoin(member.team, team).on(team.name.eq("teamA")) .fetch(); for (Tuple tuple : result) { System.out.pr..

JPA 2022.02.14

queryDsl 기본 조인에 대해

(querydsl) 조인 - 기본 조인 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭(alias)으로 사용할 Q 타입을 지정합니다. join(조인 대상, 별칭으로 사용할 Q타입) 예제 /** * 팀 A에 소속된 모든 회원 조회 */ @Test public void join() throws Exception { QMember member = QMember.member; QTeam team = QTeam.team; List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting(..

JPA 2022.02.14

Q클래스 인스턴스 사용 방법 두가지

(JPA - Querydsl) Q클래스 인스턴스를 사용하는 방법에는 두 가지가 있습니다. QMember qMember = new QMember("m"); //별칭 직접 지정 (As-is) QMember qMember = QMember.member; //기본 인스턴스 사용 (To-be) 별칭 직접 지정 (As-is) 방법 @Test public void startQuerydsl2() { QMember m = new QMember("m"); Member findMember = queryFactory .select(m) .from(m) .where(m.username.eq("member1")) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("memb..

JPA 2022.02.14
728x90