전체 글
-
AOPSpring/스프링가링가링 2022. 11. 9. 02:31
[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP (tistory.com) AOP : Aspect Oriented Programming - 관점 지향 프로그래밍 - 취지: 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하는 것 • Aspect : 흩어진 관심사를 모듈화한 것 • Target : Aspect를 적용하는 곳 (클래스, 메서드 등) • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체 • JointPoint : Advice가 적용될 위치. 메서드 진입 지점, 생성자 호출 시점, 필드에서 꺼내올 때 등 다양한 시점에 적용 가능 • PointCut : JointPoin..
-
JPA 지연로딩 사용시 N+1 문제Spring/스프링가링가링 2022. 10. 6. 15:07
JPA 지연로딩 사용시 N+ 1 문제 ORM - JPA, Spring Data JPA Embedded Database를 활용한 JPA test JPA 모든 N+1 발생 케이스과 해결책 (velog.io) JPA 모든 N+1 발생 케이스과 해결책 N+1이 발생하는 모든 케이스 (즉시로딩, 지연로딩)에서의 해결책과 그 해결책에서의 문제를 해결하는 방법에 대해 이야기 하려합니다 😀 velog.io JPA N + 1 문제 발생 이유 객체에 대해서 조회한다고 해도 다양한 연관관계들이 매핑에 의해서 관계가 맺어진 다른 객체가 함께 조회되는 경우에 N+1이 발생 => 지연로딩 사용 (연관된 객체를 사용하는 시점에 로딩) 데이터를 처음 조회한 시점에서는 N + 1 문제가 발생하지 않음 하지만, 하위 엔티티..
-
코드로 배우는 스프링부트 웹 프로젝트 Day 16Spring/코드로 배우는 스프링부트 웹 프로젝트 2022. 9. 21. 00:07
/* Annotation들은 스프링부트 프로젝트의 Annotation 정리 페이지에 따로 정리해두었습니다. */ [ 게시물 조회 테스트 ] BoardServiceTests 클래스 추가 @Test public void testGet() { Long bno = 100L; BoardDTO boardDTO = boardService.get(bno); System.out.println(boardDTO); } [ 게시물 삭제 처리 ] 게시물을 지우는 상황에서 게시물에 댓글이 없다면, 게시물의 작성자가 삭제하면 문제가 없지만, 게시물에 댓글이 있다면, 해당 댓글의 사용자들의 동의 없이 삭제되기 때문에 문제가 발생함 => 실제 개발에서는 게시물의 상태를 칼럼으로 지정하고, 해당 상태를 변경하는 형태로 처리하는 것이 일..
-
코드로 배우는 스프링부트 웹 프로젝트 Day 15Spring/코드로 배우는 스프링부트 웹 프로젝트 2022. 9. 19. 09:56
/* Annotation들은 스프링부트 프로젝트의 Annotation 정리 페이지에 따로 정리해두었습니다. */ [ 게시물 등록 ] 게시물 등록은 BoardDTO 타입을 파라미터로 전달받고, 생성된 게시물의 번호를 반환하도록 작성 실제 처리 과정에서 DTO를 엔티티 타입으로 변환할 필요가 있음 => BoardService 인터페이스에 dtoToEntity()를 작성해서 처리 BoardService 인터페이스 public interface BoardService { Long register(BoardDTO dto); default Board dtoToEntity(BoardDTO dto) { Member member = Member.builder().email(dto.getWriterEmail()).buil..
-
코드로 배우는 스프링부트 웹 프로젝트 Day 14Spring/코드로 배우는 스프링부트 웹 프로젝트 2022. 9. 14. 13:19
/* Annotation들은 스프링부트 프로젝트의 Annotation 정리 페이지에 따로 정리해두었습니다. */ [ JPQL과 left (outer) join ] 목록 화면에서 게시글의 정보와 함께 댓글의 수를 같이 가져오기 위해서는 단순히 하나의 엔티티 타입을 이용할 수 없음 => JPQL의 조인(join)을 이용해서 처리 [ left (outer) join ] 스프링부트 2버전 이후에 포함되는 JPA 버전은 엔티티 클래스 내에 연관관계가 없더라도 조인을 사용할 수 있음 [ 엔티티 클래스 내부에 연관관계가 있는 경우 ] Board 엔티티 클래스의 내부에는 Member 엔티티 클래스를 변수로 선언하고, 연관관계를 맺고 있음 이러한 경우, Board의 writer 변수를 이용해서 조인을 처리함 BoardR..
-
코드로 배우는 스프링부트 웹 프로젝트 Day 13Spring/코드로 배우는 스프링부트 웹 프로젝트 2022. 9. 12. 19:57
/* Annotation들은 스프링부트 프로젝트의 Annotation 정리 페이지에 따로 정리해두었습니다. */ [ 연관관계 테스트 ] 현재 3개의 테이블이 PK와 FK의 관계로 이루어져 있기 때문에 테스트를 위한 데이터를 추가하는 작업도 PK 쪽에서부터 시작하는 것이 좋음 test 클래스들 생성 [ 테스트 데이터 추가하기 ] MemberRespositoryTests 에 MemberRepository를 주입 예제로 사용할 Member객체를 100개 주입 MemberRepositoryTests 클래스 package org.zerock.board2.repository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.an..
-
코드로 배우는 스프링부트 웹 프로젝트 Day 12Spring/코드로 배우는 스프링부트 웹 프로젝트 2022. 9. 7. 21:57
/* Annotation들은 스프링부트 프로젝트의 Annotation 정리 페이지에 따로 정리해두었습니다. */ [ 연관관계와 관계형 데이터베이스 설계 ] 데이터베이스상에서의 관계를 해석할 때는 항상 PK(Primary Key) 쪽에서 해석 & 반영하면 혼란을 줄일 수 있음 [ PK로 설계, FK로 연관관계 해석 ] 회원, 게시물, 댓글의 관계를 PK를 기준으로 설계하면 다음과 같음 1. 회원이 있어야만 게시글 작성 가능 => 회원 테이블을 먼저 설계 2. 게시글을 작성할 때는 특정 회원과의 관계를 설정해주어야 함 3. 댓글은 게시글이 있어야만 작성 가능 => 게시글을 먼저 설계하고 댓글 테이블이 게시글을FK로 작성 게시물은 회원과 다대일 관계 (N : 1) 댓글은 게시물과 다대일 관계 (N : 1) J..
-
Optional.orElseThrow()Spring/Spring 메소드 2022. 9. 7. 18:18
/* cafe 프로젝트에서 사용한 코드 */ public AreaDTO findByAreaGno(Long gno) { Area area = repository.findById(gno).orElseThrow(); AreaDTO areaDTO = entityToDto(area); return areaDTO; } 저장된 값이 존재하면 해당 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 예외를 발생시키는 메소드 위 코드는 gno로 repository에서 엔티티를 찾아서 반환하고, 만약 값이 존재하지 않으면 예외를 발생시킨다.