전체 글

인증/인가 과정에서 발생한 예외를 처리하는 방법 인증 : 사용자의 신원 확인 인가 : 신원이 확인된 사용자가 리서스에 액세스할 수 있는 권한이 있는지 확인 ✨ AuthenticationEntryPoint : 인증 예외 인증이 안된 익명의 사용자가 인증이 필요한 엔드포인트에 접근하게 된다면 HttpStatus 401 Unauthorized와 함께 스프링의 기본 오류 페이지를 보여준다. → 이를 처리해주는 로직이 바로 AuthenticationEntryPoint 라는 인터페이스이다. 인터페이스 내부를 살펴보면 인증 프로세스를 시작하기 위해 필요에 따라 ServletRespnse의 헤더를 수정해야한다고 나와있다. 따라서 Response의 contentType과 status를 수정해야한다. - Authentic..
Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재한다. 대표적으로 생성일자, 수정일자, 식별자 같은 필드 및 컬럼이 있다. 이제 위의 필드값들은 하나씩 세팅해본다고 가정했을 때, 데이터를 생성하고 수정할때, 누가, 언제했는지 알기 위한 필드들을 사용할 때 하나하나 세팅해주는 것이 아닌 JPA에서 제공해주는 어노테이션을 사용하면 더 손 쉽게 세팅할 수 있다. JPA Auditing 이란? Spring Data JPA에서는 Auditing이라는 기능을 제공한다. 이를 사용하여 엔티티가 생성되고, 변경되는 그 시점을 감지하여 생성시각, 수정시각, 생성한 사람, 수정한 사람을 기록할 수 있다. 1. 어노테이션 추가..
@MappedSuperclass 공통 매핑 정보가 필요할 때 사용하는 어노테이션이다. @MappedSuperclass은 상속관계 매핑이 아니며, 엔티티도 아니고, 테이블과 매핑이 되지 않는다. 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할이다. 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다. 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보만을 제공하며, 직접 생성해서 사용할 일 없으므로 추상 클래스로 사용하는 것을 권장한다. 해당 부모 클래스는 따로 조회나 검색이 불가능하다. 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능하다 예시 코드 @MappedSuper..
들어가면서 JPA를 사용해서 개인프로젝트를 진행하면서 발생한 N+1문제와 이를 해결하면서 겪은 오류에 대해 정리해보려고한다. 간단한 오류해결 문제만 정리를 하려고 하니 N+1에 대한 자세한 이론은 추후에 더 정리해보도록 하겠다. 🤓 N+1 문제 상황 JPA를 사용하는 경우 xxxToOne같은 어노테이션으로 엔티티 관계가 형성되어 있을때 불필요한 쿼리가 더 수행되는 경우가 있다. 아래 코드를 보면 게시물(PostEntity)는 사용자(UserEntity) 한 명이 작성할 수 있는 경우 ManyToOne의 엔티티 관계로 형성되어 있는 것을 알 수 있다. public class PostEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_i..
한 엔티티 조회시 연관되어 있는 엔티티들을 모두 조회하는 것보다는 필요한 연관관계만 조회해 오는 것이 효과적이다. Member 객체와 연관되어있는 Team객체가 있다고 했을 때, 비지니스 로직에서 Team객체가 필요하지 않은 경우에 Member와 Team을 같이 조회하게 되면 낭비가 발생한다. 이처럼 우리는 때로 Member 객체만 조회하고 싶을 때가 있다. 이런 상황을 위해 JPA는 프록시와 지연로딩이라는 방식을 지원한다. 더보기 ❓ 여기서 잠깐! 지연로딩과 즉시로딩을 간단하게 알아보자! (밑에서 더 자세히 설명할 예정) 지연로딩 : 자신과 연관된 엔티티를 실제로 사용할 때 연관된 엔티티를 조회하는 방식 즉시 로딩 : 자신과 연관된 엔티티를 조인을 통해 함께 조회하는 방식 지연로딩과 프록시(Proxy)..
JPA의 Entity는 기본 생성자가 왜 반드시 필요할까? JPA에서는 파라미터가 없는 기본생성자를 만드는 것이 필수이다. 만약 기본 생성자를 만들지 않았다고 해도 Java 단에서는 개발자가 만든 생성자가 하나도 존재하지 않으면 자동으로 기본생성자를 만들어 주기 때문에 기본 생성자가 반드시 있게 된다. 엔티티에 기본생성자가 존재하지 않으면 어떤일이 일어날까? 게시글 Entity를 만들고, 기본 생성자를 생성하지 않아보겠다. @Getter @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Lob private String contents; public Post(String c..
엔티티 매니저 팩토리와 엔티티 매니저 일반적인 데이터베이스를 사용하고 있는 애플리케이션에서는 하나의 엔티티 매니저 팩토리를 생성해 사용한다. 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다. 처음 만들어지는 시점에 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 올 때마다 엔티티 매니저를 생성한다. 엔티티 매니저는 DB연결이 필요한 시점(보통 트랜잭션 시작되는 경우)에 커넥션 풀에 있는 connection을 얻는다. 그림을 보면 EntityManager1 과 EntityManager2가 보인다. 이중 EntityManager2는 connection을 사용하고 EntityManager1 은 사용하지 않는데, EntityManager는 데이터베이스 연결이 꼭 필요한 시점까지 connect..
엔티티의 생명주기 엔티티는 다음과 같이 4단계의 생명 주기가 있다. 비영속 (new/transient) 영속 (managed) 준영속 (detached) 삭제 (removed) 비영속 (new / transient) 객체를 새로 생성한 상태이다. 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 비영속 상태는 영속상태가 아니므로 영속성 컨텍스트에 의해 관리되지 않는다. Member member = new Member(); member.setId("memberId"); // member는 비영속상태 영속 (managed) 영속성 컨텍스트에 관리되는 상태이다. 생성한 객체를 em.persist()를 통해 영속성 컨텍스트에 저장하거나, 혹은 em.find()를 통해 DB에서 엔티티를 조회하면 영속성 컨텍스..
영속성 컨텍스트 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 저장소이다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어지며, 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있습니다. 아래 그림과 같이 데이터베이스와 애플리케이션 사이에 뭔가 중간 계층이 있는 느낌이라고 이해하면 된다. | 예를 들어 Member 테이블에 10개의 row가 저장되어 있을때 select * from member 와 같이 조회한다면 영속성 컨텍스트에 10개의 엔티티가 생성되고 관리되어 진다고 생각하면 된다. 영속성 컨텍스트의 동작방식 select * from member 와 같이 조회했을 때 영속성 컨텍스트의 동작방식을 간단하게 설명하자면 아래와 같다. 6개로 작성되어 있는 처리 과정을 코드 한 줄로 표현할..
git stash는 작업중에 갑작스럽게 다른 작업을 진행해야할 때, 작업중인 사항을 잠시 치워두는 방법이다. git stash git stash는 파일의 변경 내용을 일시적으로 기록해두는 영역이라고 생각하면 된다. git stash를 사용하면 현재 적용된 commit이후로 변경된 모든 사항들이 stash 공간으로 이동하게 된다. git stash git stash save git stash pop / git stash apply git stash로 저장한 코드를 꺼낼때 사용한다. git stash pop을 사용하면 임시 저장공간에 저장된 파일들이 지워진다. git stash apply는 임시 저장공간을 그대로 둔 채로 변경사항을 꺼낸다. git stash pop git stash apply git sta..
이투디
이투디의 개발 블로그