본문 바로가기

CS 잡지식

Paging에서의 offset과 limit의 정확한 의미!! new Member("member1",10) new Member("member2",10) new Member("member3",10) new Member("member4",10) new Member("member5",10) DB에 위와 같이 5개의 튜플이 있다고 하자. offset = 0, limit = 3으로 페이징을 하면?? -> 이 3개가 조회된다. new Member("member1",10) new Member("member2",10) new Member("member3",10) offset = 1, limit = 3으로 페이징을 하면?? -> 이 3개가 조회된다. new Member("member2",10) new Member("member3",10) new Member("member4",10).. 더보기
JPA 스펙 - 반환 타입 List,단건,Optional<단건 엔티티> public interface MemberReposiotry extends JpaRepository { //Spring Data JPA는 다양한 반환값 타입을 제공한다. //1] 반환 타입 : 컬렉션 List findListByUsernameS(String username); // 2] 반환 타입 : 단건 Member findMemberByUsername(String username); //3] 반환 타입 : 단건 with Optional Optional findOptionalByUsername(String username); @Test@Transactional public void returnTypes() { Member member1 = new Member("member1", 10); Member m.. 더보기
@NamedQuery vs @Query( JPA vs Spring Data JPA ) @Entity @NamedQuery( name="Member.findByUsername", // JPQL을 [직접] 작성해야 한다. // 이건 [정적] 메서드이다. // => 고로, 애플리케이션 로딩 시점(컴파일 시점)에 아래 JPQL을 Parsing하여 만약 // 쿼리문에 오류가 있으면, 서버가 실행되지 않고, 애플리케이션 로딩 시점에 에러를 잡아줌. // 이게 @NamedQuery의 막강한 장점이다. query="select m from Member m where m.username = :username") public class Member { @Id@GeneratedValue @Column(name = "member_id") private Long id; private String username.. 더보기
쿼리 메서드(Feat.Spring Data JPA) public interface MemberReposiotry extends JpaRepository { // List findByusername(String username); } Spring Data JPA에 대한 OverView (tistory.com) Spring Data JPA에 대한 OverView Spring Data JPA -> Spring Framework와 JPA이란 기반 위에서, [JPA]를 정말 편리하게 사용할 수 있게 해주는 Spring에서 제공하는 라이브 러리이다. 우리가 여태껏 복잡하게 순수 JPA만으로 개발해 왔던 Repositor jbluke.tistory.com 위 사이트의 [스프링 데이터]와 [스프링 데이터 JPA]의 Hierarchy를 보면, 개발자가 원하는 거의 모~~.. 더보기
JPA가 제공하는 remove() 메서드에 대한 주의!! //remove() 메서드의 [매개 변수]에는 삭제할 대상의 id가 아니라, Object가 들어 간다. public void delete(Member member){ // JPA는 remove()라는 메서드를 제공하며, entityManager.remove(member); } 이렇게 정리를 해두지 않으면 헷갈릴 것 같아 정리를 해둔다. 여기서, 우리가 한 가지를 명심해 두자!!!! JPA에서는 모~~~~~~~~든 게 해당 Transaction [내]에서 동작한다는 것이다. -> 나는 remove(Object)를 보면서, "왜 id가 아니라, Object를 넣지?"라는 생각을 했다. 그러나 이 의문은 "remove()"라는 JPA API는 특정 Transaction [내]에서 동작을 한다" 라는 것을 명심.. 더보기
Repository 구현 시, 주의점!!(feat.[수정] 메서드는 필요x) 사실, Repositor에서 [수정]용 메서드는 안 만들어도 된다. 만약 수정을 하고 싶다면 아래와 같이 하면 된다. 1. Controller or Service 계층에서 Repository :: find() 메서드 등을 통해서 EntityManager or DB로부터 수정할 객체를 조회 2. 조회된 객체의 SETTER 기능을 통해서 수정(끝) -> JPA은 Dirty Checking을 지원하기에 객체의 데이터의 변경을 감지하여 Transaction이 끝날 때 데이터의 변경을 감지하여, [자동]으로 수정을 한다. 더보기
@ToString(feat. lombok) System.out.println("member" + member)이 호출이 되면, 1] 개발자가 toString() 메서드를 오버라이딩했다면, toString()이 호출이 된다. 2] 개발자가 toString() 메서드를 오버라이딩하지 않았다면, 참조 변수가 찍힌다. -> 1]의 경우, 만약 클래스 내에 필드가 100개라면 toString()을 오버라이딩할 때, 100개의 필드에 대해 일일이 코딩을 해줘야 하는 중작업이다. Lombok에서는 이러한 문제를 @ToString()으로 한 방에 해결해 준다. @Entity @Getter@Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자를 protected로 자동 생성해준다. @ToStri.. 더보기
하이버네이트, 쿼리 파라미터 보는 법!! insert문을 실행한 SQL문을 보여 주고 있다. 그러나, VALUES(?,?)에서 [?]에 어떠한 값들이 DB에 전달이 되었는 지 알고 싶다. 그럴 때, 여러 가지 방법이 있지만 가장 좋은 방법은 p6spy 외부 라이브러리를 이요하는 것이다. (다만, Spring Boot의 버전에 따라 p6spy 라이브러리를 적용하는 방법이 다르니 주의!!) 여기서는 스프링 부트 3.x.x 버전을 기준으로 설명을 하겠다. p6spy-spring-boot-starter 라이브러리는 현재 스프링 부트 3.0을 정상 지원하지 않는다. (스프링 부트 2.x.x 에서는 위 라이브러리를 gradle에 implentation해주기만 하면 됐다) 스프링 부트 3.0에서 사용하려면 다음과 같은 추가 설정이 필요하다. 1. org.s.. 더보기