본문 바로가기

Stack/Spring16

N+1 문제 해결로 쿼리 성능 개선하기 jmeter 테스트 표본 위사진처럼 연관관계가 있는 테이블을 이렇게 조회를 했을때 사용하지는 않지만 연관관계가 있는 테이블을 모두 조회하게 되므로 비교적 지연이 걸리게된다 적용 이전의 지연시간이었다 일단 @Many to One/ @One To Many 연관관계 테이블에서의 어노테이션에 Fetch Type 을 Lazy로 잡아준다 Fetch.lazy 는 지연로딩이라는 의미이다 이렇게 실행을 하게되면 Post 조회시 User에 대한 메소드가 필요가 없어서 하이버네이트가 join 또한 하지 않고, post에 대한 select 쿼리문만 날린 것을 볼 수 있다! Fetch Join 사용 batch.fetch 사용 개선결과 추후 작성예정 2022. 8. 11.
JPA 특정 엔티티 삭제시 연관된 엔티티도 함께 삭제하기 프로젝트에서 하나의 엔티티를 삭제했을 때 이 엔티티와 연관된 다른 엔티티는 어떻게 될까?? 정답은 그 엔티티의 외래 키로 연결된 엔티티에서는 부모 엔티티가 없기 때문에 데이터베이스에서 외래 키 무결성 예외가 발생한다. 예를 들어 User 엔티티와 Article 엔티티가 있다고 보자. User와 Article는 일대다의 관계를 가진다. User 하나에 여러 개의 Article가 있는 셈이다. 여기서 만약 User를 삭제한다면 삭제한 User에 연결된 Article에서는 에러가 발생하는 것이다. 다시 말해 연관관계가 끊어졌다고 할 수 있다. 이러한 상황에서 User와 연관관계가 끊어진 Article를 고아 객체라고 한다. 그렇기에 부모 엔티티를 삭제할 때는 연관된 자식 엔티티를 모두 삭제한 후에 부모 엔티티.. 2022. 7. 12.
(CI/CD) Codedeploy 배포 GitAction 에 GitIgnore 파일 적용하는법 GitHub 작업에서 application.properties 같은 데이터 베이스 개인정보가 포함된 부분은 .gitignore 처리를해서 정보가 깃으로 노출되지않게 처리하게된다 문제는 GitAction 을 사용하는 CiCd 배포중에 . Gitignore 로 지정된 파일은 로드 하지 못한다는 문제점이있다. 이럴때 workflow / ~~.yml 파일에 shell : bash 를 적용해놓고 Git Repository 의 setting 시크릿 부분에 시크릿 변수를 지정해줘서 다음과 같은 부분을 처리해주면 된다 key 값은 위와 같을 경우에는 PROPERTIES 로 지정 value 값은 properties 의 코드 내용을 그대로 넣어주면된다 이렇게 해두면 gitignore 내용을 넣지 않고 해당 코드를 같이 빌.. 2022. 7. 12.
SQL 관계 데이터 베이스 삭제 시 참조키 관련 주의 사항 데이터 테이블에 다음과 같이 pk 값을 참조하고 있는 참조 키들이 다음 엔티티 처럼 엮여있을때 여기서 DB에 저장된Post 객체를 삭제하게 되면 해당 Post 객체의 참조키를 가지고있는 Hashtag 테이블, image 테이블, Comment 테이블 이 참조할 Pk 값이 없어지게된다. 해당 SQL 명령어가 실행됬을때 에러가 뜨면서 작동이 되지않게된다 해결방안으로 다음과 같이 Post를 참조하고있는 hashtag 와 image 를 먼저 지워준 모습이다. (comment 는 아직 적용하지 않아서 추가하지않았다.. 차후 적용할예정) 2022. 7. 12.
Entity table 에 @setter 쓰지않기 + 대처방안 이전 까지 게시글 수정 @PATCH 로직을 수행하기위해 이런식으로 set으로 변경값을 넣어주기 위해서 위 사진처럼 Entity 에 @Setter 를 넣어 수정 로직을 만들었었다 하지만 엔티티에 @setter 를 금지하는 원칙이있는것을 알게되었다 몇가지의 이유가있는데 첫번쨰, 객체의 일관성을 유지하기 힘들다 두번쨰, setter는 그 코드로 그 의도를 알기 힘들다 그래서 위사진 처럼 change엔티티 라는 메서드를 생성해주어서 위 사진처럼 수정할 엔티티 객체를 불러낸다음 change 매서드를 사용하여 다시 저장 해주면 @Setter 를 엔티티에 쓰지않고도 값을 수정할수있다! 2022. 7. 12.
Exception 처리 Exceptionhandler 사용법 일단 ErrorCode enum 클래스에 상태 코드를 적용시켜주고 private final int status를 넣어줍니다 ErrorResponse 클래스에 생성자를 만들고 방금만든 ErrorCode를 파라미터 값에 넣어줍니다 ErrorCode enum 클래스에 해당되는 같은이름으로 클래스를 지어주고 extends 로 에러 종류를 골라줍니다 여기서는 웹 로직 실행중에 일어날수있는 에러를 처리하는 부분이라서 Runtime Exception으로 처리하였습니다! 그다음 GlobalExceptionHandler 에 어노테이션 @ExceptionHandler 를 넣고 에러처리 {클래스이름} .class 값을 넣어줍니다! 여기서 리턴타입과 메서드는 저희가 ResponseEntity를 사용했기 때문에 이렇게 반환을 .. 2022. 7. 7.