Spring AOP로 API 성능 측정하기 - 프로젝트 예제와 함께
·
Stack/Spring
들어가며프로젝트를 운영하다 보면 "이 API는 왜 이렇게 느릴까?"라는 의문이 들 때가 있다. 하나하나 메서드마다 시간 측정 코드를 넣자니 번거롭고, 그렇다고 방치하자니 불안하다. 이럴 때 Spring AOP를 사용하면 코드 수정 없이 모든 API의 성능을 측정할 수 있다.이번 글에서는 Spring AOP가 무엇인지, 그리고 실제 프로젝트에 어떻게 적용하는지 정리해보았다.AOP란?**AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)**은 여러 곳에서 반복되는 공통 기능을 분리해서 관리하는 프로그래밍 기법이다.예를 들어 로깅, 성능 측정, 트랜잭션 관리 같은 기능은 비즈니스 로직과는 별개지만 여러 곳에서 필요하다. 이런 걸 **횡단 관심사(Cross-Cutting Conce..
스프링부트 DB 작동 방식과 원리
·
Stack/Spring
들어가며스프링부트 애플리케이션이 데이터베이스와 어떻게 통신하는지 궁금했던 적이 있다. 단순히 JPA의 save() 메서드를 호출하면 데이터가 저장되는데, 그 내부에서는 어떤 일이 벌어지는 걸까? 이번 글에서는 스프링부트가 DB와 통신하는 전체 과정을 정리해보았다.스프링부트에서 DB에 쿼리를 보내는 원리전체 흐름도스프링부트 애플리케이션에서 데이터베이스까지 데이터가 전달되는 과정은 다음과 같다. Controller → Service → Repository → JDBC/JPA → JDBC Driver → Database각 계층의 역할을 살펴보자.1. Controller 계층컨트롤러는 HTTP 요청을 받아 Service로 전달한다. java@RestController@RequiredArgsConstructo..
N+1 문제 해결로 쿼리 성능 개선하기
·
Stack/Spring
jmeter 테스트 표본 위사진처럼 연관관계가 있는 테이블을 이렇게 조회를 했을때 사용하지는 않지만 연관관계가 있는 테이블을 모두 조회하게 되므로 비교적 지연이 걸리게된다 적용 이전의 지연시간이었다 일단 @Many to One/ @One To Many 연관관계 테이블에서의 어노테이션에 Fetch Type 을 Lazy로 잡아준다 Fetch.lazy 는 지연로딩이라는 의미이다 이렇게 실행을 하게되면 Post 조회시 User에 대한 메소드가 필요가 없어서 하이버네이트가 join 또한 하지 않고, post에 대한 select 쿼리문만 날린 것을 볼 수 있다! Fetch Join 사용 batch.fetch 사용 개선결과 추후 작성예정
JPA 특정 엔티티 삭제시 연관된 엔티티도 함께 삭제하기
·
Stack/Spring
프로젝트에서 하나의 엔티티를 삭제했을 때 이 엔티티와 연관된 다른 엔티티는 어떻게 될까?? 정답은 그 엔티티의 외래 키로 연결된 엔티티에서는 부모 엔티티가 없기 때문에 데이터베이스에서 외래 키 무결성 예외가 발생한다. 예를 들어 User 엔티티와 Article 엔티티가 있다고 보자. User와 Article는 일대다의 관계를 가진다. User 하나에 여러 개의 Article가 있는 셈이다. 여기서 만약 User를 삭제한다면 삭제한 User에 연결된 Article에서는 에러가 발생하는 것이다. 다시 말해 연관관계가 끊어졌다고 할 수 있다. 이러한 상황에서 User와 연관관계가 끊어진 Article를 고아 객체라고 한다. 그렇기에 부모 엔티티를 삭제할 때는 연관된 자식 엔티티를 모두 삭제한 후에 부모 엔티티..
(CI/CD) Codedeploy 배포 GitAction 에 GitIgnore 파일 적용하는법
·
Stack/Spring
GitHub 작업에서 application.properties 같은 데이터 베이스 개인정보가 포함된 부분은 .gitignore 처리를해서 정보가 깃으로 노출되지않게 처리하게된다 문제는 GitAction 을 사용하는 CiCd 배포중에 . Gitignore 로 지정된 파일은 로드 하지 못한다는 문제점이있다. 이럴때 workflow / ~~.yml 파일에 shell : bash 를 적용해놓고 Git Repository 의 setting 시크릿 부분에 시크릿 변수를 지정해줘서 다음과 같은 부분을 처리해주면 된다 key 값은 위와 같을 경우에는 PROPERTIES 로 지정 value 값은 properties 의 코드 내용을 그대로 넣어주면된다 이렇게 해두면 gitignore 내용을 넣지 않고 해당 코드를 같이 빌..
SQL 관계 데이터 베이스 삭제 시 참조키 관련 주의 사항
·
Stack/Spring
데이터 테이블에 다음과 같이 pk 값을 참조하고 있는 참조 키들이 다음 엔티티 처럼 엮여있을때 여기서 DB에 저장된Post 객체를 삭제하게 되면 해당 Post 객체의 참조키를 가지고있는 Hashtag 테이블, image 테이블, Comment 테이블 이 참조할 Pk 값이 없어지게된다. 해당 SQL 명령어가 실행됬을때 에러가 뜨면서 작동이 되지않게된다 해결방안으로 다음과 같이 Post를 참조하고있는 hashtag 와 image 를 먼저 지워준 모습이다. (comment 는 아직 적용하지 않아서 추가하지않았다.. 차후 적용할예정)
Entity table 에 @setter 쓰지않기 + 대처방안
·
Stack/Spring
이전 까지 게시글 수정 @PATCH 로직을 수행하기위해 이런식으로 set으로 변경값을 넣어주기 위해서 위 사진처럼 Entity 에 @Setter 를 넣어 수정 로직을 만들었었다 하지만 엔티티에 @setter 를 금지하는 원칙이있는것을 알게되었다 몇가지의 이유가있는데 첫번쨰, 객체의 일관성을 유지하기 힘들다 두번쨰, setter는 그 코드로 그 의도를 알기 힘들다 그래서 위사진 처럼 change엔티티 라는 메서드를 생성해주어서 위 사진처럼 수정할 엔티티 객체를 불러낸다음 change 매서드를 사용하여 다시 저장 해주면 @Setter 를 엔티티에 쓰지않고도 값을 수정할수있다!
Exception 처리 Exceptionhandler 사용법
·
Stack/Spring
일단 ErrorCode enum 클래스에 상태 코드를 적용시켜주고 private final int status를 넣어줍니다 ErrorResponse 클래스에 생성자를 만들고 방금만든 ErrorCode를 파라미터 값에 넣어줍니다 ErrorCode enum 클래스에 해당되는 같은이름으로 클래스를 지어주고 extends 로 에러 종류를 골라줍니다 여기서는 웹 로직 실행중에 일어날수있는 에러를 처리하는 부분이라서 Runtime Exception으로 처리하였습니다! 그다음 GlobalExceptionHandler 에 어노테이션 @ExceptionHandler 를 넣고 에러처리 {클래스이름} .class 값을 넣어줍니다! 여기서 리턴타입과 메서드는 저희가 ResponseEntity를 사용했기 때문에 이렇게 반환을 ..
ERD 구조와 데이터 처리를 위한 Arraylist 활용 - 마켓컬리 클론코딩
·
Stack/Spring
이번주에 마켓컬리 클론코딩을 할때 설계한 ERD 구조이다 기존에 작업했던 프로젝트들보다 코드가 복잡한느낌이있었지만 데이터 설계적 측면에서 다양한 값이 나올수있는부분은 따로 테이블을 만든다는점 ! 에서 좋은참고가되었다! 이런식의 구조로 product 에 따라오는 productdetail 테이블 을 따로 만들어주어 기능적으로 메인페이지나 상품목록조회에서 필요한 사진, 가격, 상품이름들을 빠로 빼두고 세부 페이지에서 필요한 냉장방법, 배송 기간들의 데이터를 따로 관리하게 된다. ============================================================================================ 서비스부분 생성자에 ArrayList를 사용하여 연관디비 내용 추가하..