
[Spring Data JPA] 사용자 정의 레파지토리 생성
2022. 9. 26. 20:40
스프링/JPA
레파지토리에 구현한 메서드만으로 해결이 어려운 복잡한 쿼리, 동적 쿼리 등은 보통 사용자 정의 레파지토리를 만들어서 해결한다. 그리고 핵심 비즈니스 로직이 담긴 쿼리와 그 외 특정 용도로 만든 쿼리를 분리해주는게 베스트 인 것도 이유가 된다. 바로 알아보겠다. 사용자 정의 레파지토리 생성 public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 레파지토리를 생성한다. 일반적인 인터페이스로 생성하면 되며, 별도의 어노테이션은 기본적으로 없어도 된다. 임의의 클래스 만들어서 사용자 정의 레파지토리 상속받기 @RequiredArgsConstructor public class MemberRepositoryImpl implements ..

[Thymeleaf] 다양한 연산자
2022. 9. 23. 16:24
스프링/Thymeleaf
Thymeleaf 산술 연산 일반적인 산술 연산 기호다. 식을 써서 boolean 값을 반환할 수도 있다. 입력 산술 연산 10 + 2 = 10 % 2 == 0 = 출력 비교 연산 일반적인 비교 연산 기호로 표시 가능하다. 태그 표시와 혼동을 방지하여 문자로 대체할 수도 있다. 입력 비교 연산 1 > 10 = 1 gt(>) 10 = 1 >= 10 = 1 ge(>=) 10 = 1 == 10 = 1 != 10 = 1 < 10 = 1 lt(

[Thymeleaf] html -> html 다이렉트로 파라미터 값 전달하기
2022. 9. 22. 20:48
스프링/Thymeleaf
Thymeleaf 스프링 MVC에서는 View -> Controller -> View 순서로 코드를 작성해 값을 전달하는게 일반적이다. Thymeleaf를 사용하면 컨트롤러에 파라미터값 전달을 위한 코드 작성 없이 바로 html로 값을 전달할 수 있다. 파라미터값 보내기 컨트롤러에 매핑 된 주소에 파라미터 값을 담는다. (html 파일이 아니라 컨트롤러 주소인 것에 주의하자.) 컨트롤러에서 파라미터 값을 받기 위한 별개의 코드 없이, html에서 타임리프를 사용해 "${param.***}" 를 작성하면 간단하게 파라미터 값을 전달받을 수 있다. 리뷰 남기기 타임리프를 사용해서 RequestParam으로 이렇게 전달 후 동일하게 "${param.***}" 으로 받을 수도 있다. 스프링을 사용하면서 간단한 ..

[Thymeleaf] text 기능으로 스프링 컨트롤러에서 값 가져오기
2022. 9. 22. 19:56
스프링/Thymeleaf
Thymeleaf th:text @RequestMapping("memberList") @Controller public class MyController { @GetMapping("member") public String memberInfo(Model model) { Member member = new Member("John", 29); model.addAttribute("member", member); return "main/information"; } @Data static class Member { private String name; private int age; public Member(String name, int age) { this.name = name; this.age = age; } }..

[Spring Data JPA] Update 쿼리 사용해서 Bulk로 수정하기.
2022. 9. 21. 17:48
스프링/JPA
변경감지 vs Bulk업데이트 JPA에는 변경감지 기능이 있다. 영속성 컨텍스트에서 불러온 엔티티의 값을 Setter 등의 메서드로 수정해주면 그 값이 영속성 컨텍스트에 반영되는 것을 말한다. 그런데 만약 엔티티들에 일괄적으로 동일한 값을 추가하거나 삭제하는 등의 수정이 필요할 때, 변경감지로 인한 값 수정은 최선이 아닐 수 있다. 해당 엔티티들을 개별적으로 전부 영속성 컨텍스트에서 꺼내와서 하나씩 변경된 값을 반영해야 하기 때문이다. 그렇기에 우리는 직접 쿼리를 작성해서 한번에 값을 수정해볼 것이다. public interface MemberRepository extends JpaRepository { @Modifying(clearAutomatically = true) @Query("update Mem..

[Spring Data JPA] 페이징 메서드 구현 - Page 타입
2022. 9. 20. 21:07
스프링/JPA
public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age " + "order by m.userName desc", Member.class) .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } 순수 JPA로 페이징을 한다면 위와 같이 메서드를 만들고 JPQL을 작성해야 했다. Spring Data JPA는 이 과정을 훨씬 쉽게 구현할 수 있게 해줄 뿐 아니라, 여러 가지 기능도 갖고 있어 코드 작성을 수월하게 도와준다. 페이징을 위해서는..

[Spring Data JPA] @NamedQuery 없이 레파지토리에 직접 쿼리 작성하기
2022. 9. 19. 22:30
스프링/JPA
지난번 엔티티에 @NamedQuery를 이용해 JPQL을 작성 후 값을 조회하는 방법을 알아보았다. https://imcoding.tistory.com/60 [Spring Data JPA] NamedQuery 사용하기 NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 imcoding.tistory.com 하지만 실제로 위 방법은 실무에서 많이 쓰이지 않는다. 엔티티에 쿼리문을 작성하는 방식 자체가 속성값만을 유일하게 갖는 게 베스트인 엔티티 취지에 맞지 않기 때문이다. 오히려 쿼리문은 레파지토리에 직접 작성하는 게 더 어..

[Spring Data JPA] NamedQuery 사용하기
2022. 9. 19. 20:47
스프링/JPA
NamedQuery Spring Data Jpa는 기본적으로 findAll, saveAll과 같이 CRUD를 포함한 기본적인 공통 메서드를 인터페이스로 제공한다. 그런데 만약, 단순히 전체 값을 조회하거나 키 값을 기준으로 조회하는 것 외에 특성 조건에 따른 값을 조회하고자 한다면 어떻게 해야할까? 물론 엔티티 매니저가 제공하는 createQuery 메서드를 사용해 JPQL문으로 DB에서 값을 조회할 수 있다. 하지만 만약 JPQL문의 컬럼명이 잘못 되었어도 해당 메서드를 호출하기 전에는 에러가 발생하지 않아 알아차리기 힘들다. 메서드 이름으로 쿼리를 생성해주기도 하지만, 조건이 많아질수록 메서드 이름이 길어진다는 단점이 있다. (findByAgeLessThan, findByUserNameAndAgeGr..

[Git] push 에러 해결
2022. 9. 17. 23:42
Git
레파지토리를 새로 만들고 push를 했으나 위와 같은 오류가 발생했다. 메시지에서 유추할 수 있듯이, 연결 자체가 문제는 아니다. git 저장소를 연결할 때 ssh 주소를 가져와서 그렇다. 해결법은 간단하다. 주소를 http로 바꿔주면 된다. 우선, 아래 명령어를 통해 연결은 잘 되었는지, 내가 가져온 주소가 ssh 형식인지 확인하자. git remote -v 위와 같이 나온다면 연결은 잘 된 것이다. 하지만 주소가 역시나 ssh 형식이다. git remote set-url 을 통해 http 형식으로 바꿔주자. git remote set-url origin https://github.com/lyhjohn/Mission2.git 이후 원하는 브랜치로 push 해보면 정상 작동할 것이다. git push -..

[JPA] 일대다 연관 관계 매핑
2022. 9. 13. 20:30
스프링/JPA
Entity 일대다 연관 관계 매핑 읽기 전에 참고하면 좋은 글 더보기 https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. imcoding.tistory.com https://imcoding.tistory.com/57 [JPA] 다대일 연관 관계 매핑 Entity 다대일 연관 관계 매핑 연관관계의 주인? 연관관계의 주인에 대한 개념이 없다면 아래 글을 먼저 읽고 오시길 권장드립니다. https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계 imc..

[JPA] 다대일 연관 관계 매핑
2022. 9. 13. 18:27
스프링/JPA
Entity 다대일 연관 관계 매핑 연관관계의 주인? 연관관계의 주인에 대한 개념이 없다면 아래 글을 먼저 읽고 오시길 권장드립니다. https://imcoding.tistory.com/56 [JPA] 엔티티 연관관계의 주인 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. imcoding.tistory.com 다대일(N : 1) 연관 관계 매핑 1. 멤버와 팀이 N : 1 관계로 있다. 2. 멤버는 하나의 팀에만 소속될 수 있고, 한 팀당 여러명의 멤버가 있을 수 있다. 이해를 돕기 위해 위 구조를 가지고 설명을 시작하겠다. 우선, 외래키는 멤버(N) 테이블에 존재한다. (..

[JPA] 엔티티 연관관계의 주인
2022. 9. 13. 18:26
스프링/JPA
Entity 연관관계의 주인 개념 외래키를 관리할 객체를 말한다. 엔티티의 연관관계는 테이블에서와 객체에서 각각 존재한다. 테이블에서는 사실 연관관계의 주인이 누구건간에 테이블 구조는 똑같다. 두 테이블 중 외래키를 갖고 있는 곳은 한 곳이며, 이 외래키 하나로 양쪽 테이블이 서로 조인하여 데이터를 가져올 수 있다. 하지만, 객체에서는 다르다. 두 테이블 A와 B가 N : 1로 연관관계가 매핑되어 있다면 A에는 B를 객체로 생성할 수 있고, B에서도 A를 List에 넣어 관리할 수 있다. 1 : 1 혹은 N : N으로 매핑되어 있다고 가정해도, 동일하게 양 쪽 모두에서 서로를 객체로 생성하여 관리할 수 있다. 이런 차이 때문에 두 객체 중 한 곳에서 외래키를 관리할 수 있도록 연관관계의 주인을 정해줘야 ..