728x90

Programming/Spring 86

Spring - 페이징 (Jpa, Querydsl)

- 주요 객체 1. Page : 페이지 정보를 담게 되는 인터페이스 2. Pageable : 페이지 처리에 필요한 정보를 담게 되는 인터페이스 - 관계 및 사용 1. PageRequest에 의해 Pageable에 페이징 정보가 담겨 객체화 된다. 2. Pageable이 JpaRepository가 상속된 인터페이스의 메서드에 파라미터로 전달된다. 3. 2번의 메서드의 return으로 Page가 전달 된다. 4. 전달된 Page에 담겨진 Page 정보를 바탕으로 로직을 처리하면 된다. - PageRequest의 메서드 1. of(int page, int size) : 0부터 시작하는 페이지 번호와 개수, 정렬이 지정되지 않은 상태 2. of(int page, int size, Sort sort) : 페이지 ..

Programming/Spring 2023.08.31

Spring - 게시글 조회 (다건 조회, 임시 H2 활용한 실제 서비스 확인)

- 게시글 여러개를 조회하기 위한 Controller를 작성 - PostController.java ..... @GetMapping("/posts") public List getList() { return postService.getList(); } } - 기존의 데이터를 가져오는 것이기 때문에 Post가 아닌 Get을 사용하며, 게시글을 여러개 가져올 것이기 때문에 Post 엔티티를 여러개 가여와야 하지만 원하는 조건에 응답을 하기 위해 PostResponse List로 받아온다. - PostService.java ..... public List getList() { return postRepository.findAll().stream() .map(post -> new PostResponse(post)..

Programming/Spring 2023.08.30

Spring - 게시글 조회, 클래스 분리 (단건)

- 게시글 단건 조회 - PostService.java ... public Post get(Long postId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 글입니다.")); return post; } } - Jpa를 통해 postRepository에서 findById를 통해 Id값에 해당하는 Post 엔티티 값을 가져온다. - 기본적으로 값이 없을 경우 null이 반환되기 때문에 Optional로 반환 타입을 지정해야 하지만 참조형을 Post 엔티티로 지정하는 대신 null과 같이 예외가 발생하는 경우 던져버리는 형식으로 바꿔서 사용할 수 있다. * Optiona..

Programming/Spring 2023.08.29

Spring - 클래스 분리, 데이터 저장 (Builder, ObjectMapper, 상황 별Controller 반환 값 등...)

- 데이터 DB에 저장 - 일반적으로 Controller -> (DTO) -> Service -> (DTO) -> Repository -> (Entity, Domain) -> DB 와 같이 클라이언트의 요청이 들어오고 DB에 데이터가 저장되는 흐름이다. - Post.java @Entity @Getter @NoArgsConstructor(access = AccessLevel.PUBLIC) public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @Lob private String content; @Builder public Post(String title, S..

Programming/Spring 2023.08.29

Spring - 데이터 검증(컨트롤러, 데이터 타입, @ControllerAdvice...)

- HTTP method - GET : 메서드 GET는 지정된 리소스의 표현을 요청합니다. 를 사용하는 요청은 GET데이터 검색만 해야 합니다. - HEAD : 이 메서드는 요청과 동일하지만 응답 본문이 없는 HEAD응답을 요청합니다 .GET - POST : 이 POST메서드는 엔터티를 지정된 리소스에 제출하며, 종종 서버의 상태 변경이나 부작용을 유발합니다. - PUT : 이 PUT메서드는 대상 리소스의 모든 현재 표현을 요청 페이로드로 바꿉니다. - Delete : 이 DELETE메서드는 지정된 리소스를 삭제합니다. - Connect : 이 CONNECT방법은 대상 리소스로 식별된 서버에 대한 터널을 설정합니다. - Options : 이 OPTIONS방법은 대상 리소스에 대한 통신 옵션을 설명합니다...

Programming/Spring 2023.08.28

JPA - 기본 동작 방식, 아키텍처

- JPA 사용 시 장점 1. 특정 데이터베이스에 종속되지 않음 2. 객체지향적 프로그래밍 3. 생산성 향상 - JPA 사용 시 단점 1. 복잡한 쿼리 처리 2. 성능 저하 위험 3. 학습 시간 - ORM : Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말한다. - 객체지향과 관계형 데이터베이스 간의 패러다임이 불일치하기 때문에 이를 해결하기 위해 나온 기술이 ORM이다. - 객체는 객체지향적으로, 데이터베이스는 데이터베이스 대로 설계를 한다. ORM은 중간에서 2개를 매핑하는 역할을 한다. - JPA 동작 방식 1. 엔티티 1.1. 데이터베이스의 테이블에 대응하는 클래스 1.2. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다. ..

Programming/Spring 2023.08.01

Spring Data JPA - 새로운 엔티티 구별하기

- JPA의 save() 메서드 1. 새로운 엔티티면 저장(persist) 2. 새로운 엔티티가 아니면 병합(merge) - 새로운 엔티티를 판단하는 기본 전략 1. 식별자가 객체일 때 null 로 판단 2. 식별자가 자바 기본 타입일 때 0 으로 판단 3. Persistable 인터페이스를 구현해서 판단 로직 변경 가능 - Item 엔티티 @Entity @Getter public class Item { @Id @GeneratedValue private Long id; } - Item Repository public interface ItemRepository extends JpaRepository { } - save() 메서드 @Transactional @Override public S save(S e..

Programming/Spring 2023.07.26

Spring Data JPA - Web 확장 (도메인 클래스 컨버터, 페이징과 정렬)

- 도메인 클래스 컨버터 - 도메인 클래스 컨버터 사용 전 @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); - 도메인 클래스 컨버터 사용 후 @GetMapping("/members2/{id}") public String findMember(@PathVariable("id") Member member) { return member.getUsername(); } - 위와 같이 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩하거나 엔티티 ..

Programming/Spring 2023.07.26

Spring Data JPA - Auditing

- Auditing은 데이터베이스 테이블의 생성, 수정, 삭제와 같은 작업들에 대한 변경 이력을 추적하는 기능을 제공하는 방법이다. - JPA를 이용한 방법 @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updateDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createdDate = now; updateDate = now; } @PreUpdate public void preUpdate() { upd..

Programming/Spring 2023.07.26

Spring Data JPA - 사용자 정의 리포지토리

- 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성한다. - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다. - 스프링 데이터 JPA 인터페이스의 메서드를 직접 구현하고 싶다면 사용자 정의 인터페이스를 사용해야 한다. - JPA 직접 사용(EntityManager) - 스프링 JDBC Template 사용 - MyBatis 사용 - 데이터베이스 커넥션 직접 사용 등등... - Querydsl - 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } - 사용자 정의 인터페이스 구현 클래스 @RequiredArgsConstructor..

Programming/Spring 2023.07.26
728x90