백엔드 썸네일형 리스트형 쿼리dsl - 조인과 서브쿼리 기본 조인 List team1 = qf.selectFrom(member) .join(member.team, team) .where(team.name.eq("team1")) .fetch(); 기본적인 join 쿼리를 만드는 방법이다. 만약 전혀 연관관계가 없는 경우라면 세타 조인을 쓰면 된다. List fetch = qf.select(member) .from(member, team) .where(member.username.eq(team.name)) .fetch(); 이건 sql 문으로 번역이 되면 from 절에 테이블을 나열한 것으로 번역된다. 세타조인 주의 사항 - 외부 조인 불가능 ON을 활용한 조인 ON을 활용해서 조인하게 되면 Cartesian Product처럼 N*M개의 결과가 나오는 것이 아닌.. 더보기 쿼리 dsl 기초 QType 쿼리dsl 컴파일러가 실행되면 엔티티들을 대상으로 QType 클래스들을 만든다. 쿼리 dsl에서는 이 QType 클래스를 대상으로 쿼리를 만들어낸다. Q클래스 인스턴스의 사용법 2가지 QMember qmem = new Qmember("m"); // 별칭을 주며 직접 생성하기 QMember qmem = QMember.member; 싱글톤으로 구현된 기본 인스턴스 사용하기 1번 방법은 직접 별칭을 주는 것이고 2번의 방법은 기본값을 사용하는 것이다. 해당 QType 인스턴스를 대상으로 쿼리를 생성하면 아래와 같은 쿼리가 생긴다. 위에서 Qtype의 별칭은 sql로 번역이 될때 테이블 별칭을 말한다. 다양한 쿼리 Qtype 인스턴스가 제공해주는 다양한 함수들을 통해 where에 여러 조건을 주는 것.. 더보기 쿼리 dsl 입문 쿼리 dsl 쿼리 dsl은 쿼리를 자바 코드로 작성할 수 있도록 해준다. 이를 통해 아래 두가지 이점을 얻을 수 있다. 1. 컴파일 시점에 문법 에러를 잡아줌 2. 동적 쿼리 문제 해결! 쿼리 dsl은 jpql의 빌더 역할을 한다. 쿼리 dsl 코드는 결국 jpql로 번역된다. 앞서 jqpl에는 몇가지 불편사항, 문제점이 있었다. String name = "james"; em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name",name).getResultList(); 쿼리에 오타가 있을 경우에 잡아내지 못한다. (jpql 처음 사용해서 개발할 때에 이걸로 시간 엄청 까먹었다...) Stri.. 더보기 스프링 No serializer found for class 에러 해결 문제는 아래와 같은 코드에서 발생했다. @RestController public class ItemController { @GetMapping("/items") public List items(){ List itemList = new ArrayList(); itemList.add(new Item("ldsa", 25)); return itemList; } static class Item { private String name; private int age; public Item(String name, int age) { this.name = name; this.age = age; } } } 발생한 이유는 간단하다. 리턴 타입이 객체이므로 메시지 컨버터에서 Json으로 변환해줘야 하는데 private 필드들.. 더보기 스프링 데이터 jpa - 구현체 코드 구경, 쿼리 dsl 구현체 살펴보기 스프링 데이터 jpa 레포지토리의 구현체이다. 특징 1. @Repository 스프링 빈의 컴포넌트 스캔대상 Exception을 서비스, 컨트롤러로 넘길때 스프링의 Exception으로 변경되어 올라감. 특징 2. @Transactional 그래서 레포지토리나 서비스에서 @Transactional이 안달려있어도 잘 동작했던 것. save 동작과정 디비에 결과를 반영해야하는 save같은 경우에는 readonly 옵션이 false이다. save 메소드 내부에서는 엔티티의 pk가 null이면 if문 내부로 들어갈 것이다. 하지만 만약에 다음과 같은 상황이라면? public class Member extends JpaBaseEntity { @Id private Long id; //기본생성자 //.. 더보기 스프링 데이터 JPA - 사용자 정의 클래스, Auditing, MVC 페이징 사용자 정의 레포지토리 사용자 정의 레포지토리 만드는 법 1. 인터페이스 만들기 public interface MemberCustomRepo { List findMemCustom(); } 2. 구현체 만들기 - 이름을 맞춰줘야함(설명은 아래에) @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberCustomRepo{ private final EntityManager em; @Override public List findMemCustom() { return em.createQuery("select m from Member m").getResultList(); } } 3. 스프링 데이터 jpa 레포지토리에 1에서 만든 인터페.. 더보기 스프링 데이터 jpa 기본 기능정리 파라미터 바인딩 파라미터 바인딩에는 위치 기반과 이름 기반이 있다. 이름기반을 사용하자!! (유지보수와 가독성이 좋음) @Query("select m from Member m where m.username=:username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); 컬렉션을 파라미터로 넘길때도 아래와 같이 가능하다. @Query("select m from Member m where m.username in :names") List findByNames(@Param("names") List names); 반환값 & 페이징과 정렬 List findMemlistByUsername(Stri.. 더보기 스프링 데이터 JPA 기초 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard 실전! 스프링 데이터 JPA - 인프런 | 강의 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다 www.inflearn.com 위 강의를 들으며 정리한 글입니다. 스프링 데이터 jpa 기존의 jpa 레포지토리와는 다르게 스프링 데이터 레포지토리를 만드는 방법은 그냥 인터페이스를 하나 만들기만 하면 된다. public interface TeamRep.. 더보기 PRG (Post Redirect Get) 상황 사용자가 상품을 구매한 상황. 이 때 사용자의 마지막 요청은 POST로 상품 구매 요청이다. 이 상태에서 그대로 사용자가 새로고침 버튼을 누르게 되면 이전의 요청이 그대로 나가서 물건을 한번 더 구매하는 상황이 발생하게 된다. 이를 방지하기 위한 것이 PRG 이다. PRG (1) 구매자가 상품을 구매하는 화면에서 주문 버튼을 클릭한다. POST메소드를 사용한 요청이 전송된다. (2) 서버는(1)의 요청에서 받은 상품 구매 처리를 DB에 반영한다. (3) 서버는 응답값으로 리다이렉트를 하도록 해서 상품 구매 완료 화면을 표시한다. (4) 리다이렉트에 의해 브라우저가 상품 구매 완료 화면을 표시하도록 서버에 요청을 보낸다. 이때 요청는 GET메소드를 사용한다. (5) 서버가 상품 구매 완료 화면을 보내.. 더보기 스프링 MVC - 응답데이터와 메시지 컨버터 응답 데이터 생성 스프링 응답 데이터타입 3가지 👉 정적 리소스, 뷰 템플릿, http 메시지 바디 1. 정적 리소스 스프링 부트에서 제공하는 정적 리소스의 디렉토리 /static /public /resources /META-INF/resources static이 아닌 public 이라는 이름의 폴더를 만들어서 열어보면 잘 열린다..!! 2. 뷰템플릿 동적인 html 제공시 뷰 템플릿 사용한다. 뷰 템플릿을 거쳐서 html이 만들어지고 뷰가 응답을 만들어서 전달한다. 스프링 부트에서 뷰 템플릿 기본 경로 : src/main/resources/templates @RequestMapping("/response-view-v1") public ModelAndView resView1() { ModelAndView.. 더보기 이전 1 2 3 4 5 다음