Spring

    JPA 객체지향 쿼리 언어 소개

    JPA 객체지향 쿼리 언어 소개

    JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 대부분 JPQL, QueryDSL로 해결한다. JPQL SQL을 추상화한 객체 지향 쿼리 언어이다. SQL과 문법이 유사함. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원) JPQL은 엔티티 객체를 대상으로 쿼리를 수행함. (SQL은 데이터베이스 테이블을 대상으로 쿼리를 수행함) SQL을 추상화했기에 특정 DB 문법에 의존하지 않음. List result = em.createQuery("select m from Member m where m.username like '%kim..

    JPA 프록시 (즉시로딩, 지연로딩)

    JPA 프록시 (즉시로딩, 지연로딩)

    Member를 조회할 때 Team도 함께 조회해야 할까? 만약 Member와 Team이 연관관계로 맺어져있다. 이 때, Member를 조회하면 JPA는 Team까지 조회하게 된다. 위 코드처럼 member와 team을 함께 출력하거나 사용하는 메서드가 있을때는 전부 조회하는 것이 좋다. 하지만 member만 사용하는 메서드라면 굳이 team까지 조회해야 할까? 이것은 불필요한 성능을 사용하게 되는 것이다. 지연로딩 LAZY 사용해서 프록시로 조회 그렇다면 불필요한 성능을 피하기위해서 전부 조회하지않으려면 어떻게 해야할까? 바로 지연로딩 LAZY를 사용하는 것이다! Member와 Team이 다대일 관계로 맺어져있는데 이때 FetchType.LAZY 를 사용하는 것이다. 위 사진처럼 동작을 수행한다고 했을때..

    스프링부트 시큐리티 - SNS 로그인과 SNS 회원가입

    스프링부트 시큐리티 - SNS 로그인과 SNS 회원가입

    https://ssdragon.tistory.com/83 스프링부트 시큐리티 - 일반 로그인과 회원가입 Spring Boot DevTools Lombok Spring Web Spring Data JPA H2 Database OAuth2 Client Thymeleaf 위 라이브러리들을 추가하여 스프링 시큐리티 예제를 만들어보자. implementation 'org.springframework.boot:sp.. ssdragon.tistory.com 이전 프로젝트에서 이어서 하겠다. 스프링 시큐리티 구글 https://console.cloud.google.com/apis/dashboard Google Cloud Platform 하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을..

    스프링부트 시큐리티 - 일반 로그인과 회원가입

    스프링부트 시큐리티 - 일반 로그인과 회원가입

    Spring Boot DevTools Lombok Spring Web Spring Data JPA H2 Database OAuth2 Client Thymeleaf 위 라이브러리들을 추가하여 스프링 시큐리티 예제를 만들어보자. implementation 'org.springframework.boot:spring-boot-starter-security' 아 그리고 제일 중요한 Security를 추가하지 않았는데 이 때는 build.gradle에 위 코드를 추가하여 시큐리티를 설치하자. 설치가 끝나고 스프링을 시작하여 http://localhost:8080으로 바로 들어가면 스프링 시큐리티가 제공하는 로그인페이지가 나온다. 이렇게 패키지를 만들어두고 이 구조를 기준으로 설명하겠다. 먼저 domain 패키지에 ..

    IntelliJ 파일 업로드 주의사항

    IntelliJ 파일 업로드 주의사항

    https://ssdragon.tistory.com/99 [Spring] 스프링에서 파일저장하기 https://ssdragon.tistory.com/82 [Spring] IntelliJ 파일 업로드 주의사항 @PostMapping("/filetest") public String addImage2(@RequestParam("Photo") MultipartFile uploadFile, HttpServletRequest request).. ssdragon.tistory.com 파일 저장은 위 게시글을 살펴보자. @PostMapping("/filetest") public String addImage2(@RequestParam("Photo") MultipartFile uploadFile, HttpServletRe..

    Entity 보다는 DTO로 반환하자.

    클라이언트의 요청에 응답하여 보낼 때 Entity로 보내는 경우가 있다. 이럴 때 주의해야할 점을 확인해보자. 1. Entity 반환 시 클라이언트에 과도한 정보 반환 Entity를 반환하면 테이블 공개나 다름없으므로 보안 문제가 있음 (즉, Entity를 UI계층에 노출하는 것은 X) 필요 이상으로 요청과 응답을 한다면 속도 문제 발생 따라서 DTO로 클라이언트에 필요한 값만 반환하는 것이 좋음 2. 양방향 연관관계에서 무한 반복이 일어날 수 있으므로 DTO로 두는것이 좋다. Entity가 서로 참조하는 객체를 계속 호출하는 경우가 생길 수 있음. (e.g. toString) Entity 반환이 잘 되더라도 추후 양방향 연관관계를 추가하고, JSON 직렬화 하다가 무한 반복 발생이 가능 3. Valid..

    JPA 객체 생성 방법

    JPA 객체 생성 방법

    객체를 생성할 때는 다음 3가지 방법 중 사용하게 된다. 생성자 정적 팩토리 메서드 Builder 패턴 엔티티 상황에 따라서 이 중 한가지를 선택하고, 파라미터에 객체 생성에 필요한 데이터를 다 넘기는 방법을 사용한다. 정적 팩토리 메서드와 Builder패턴을 사용할 때는 생성자를 private 처리를 하는데 JPA가 사용을 해야한다면 protected로 처리한다. 객체 생성이 간단하면 단순 생성자를 사용하지만, 의미가 있거나 복잡하다면 나머지 방법을 사용하는 것이 좋다. 엔티티를 만들 때는 외부에서 값을 쉽게 변경할 수 없게 @Setter 를 사용하지 않는다. Setter는 의도가 분명치 않고, 변경하면 안되는 중요한 값임에도 변경가능한 값으로 착각할 수 있다. (안전성 보장x) 그러면 어떻게 값을 변..

    JPA 연관관계 매핑 기초

    JPA 연관관계 매핑 기초

    엔티티는 다른 엔티티와 연관관계가 대부분 있다. 그럴 경우 어떻게 표현할까? 단방향과 양방향이 있다. 회원 → 팀 ( 회원은 팀을 참조한다 ) 팀 → 회원 ( 팀은 회원을 참조한다 ) 위의 두 가지 관계에서 하나만 성립하는 경우 단방향 관계, 두 가지 관계 모두 참조하면 양방향 관계라고 한다. 단방향 연관관계 객체 연관관계에서는 단방향 관계이기에 member → team 조회는 가능하지만 반대의 경우는 할 수 없다. 그래서 Member.team필드를 통해서 팀을 알 수 있지만, 반대로 팀은 회원을 알 수 없다. 테이블 연관관계에서는 양방향 관계이기에 양 쪽 조회가 가능하다. MEMBER 테이블의 TEAM_ID 외래키로 MEMBER JOIN TEAM 과 TEAM JOIN MEMBER 둘 다 가능하다. 객체..