본문 바로가기

전체 글38

Singleton(싱글톤) 패턴이란? 싱글톤패턴이란? - 클래스의 인스턴스(객체)가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 입니다. - 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 합니다. - private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 합니다. 예시코드 코드를 살펴보자면 다음과 같습니다. 1. static 영역에 객체를 미리 하나 생성해서 올려둡니다. 2. 이 객체 인스턴스가 필요하면 오직 getInstance() 메서드를 통해서만 조회할 수 있다. 이 메서드를 호출하면 항상 같은 인스턴스를 반환합니다. 3. 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막습니다. 위의 코드가 정상적으로.. 2021. 12. 20.
Spring의 DI는 왜 생성자 주입으로? 들어가기에 앞서 Spring에서의 DI는 대표적으로 3가지 방법이 있다는 것은 많은 사람들이 아는 보편적인 지식입니다. 그리고 3가지 방법중 생성자 주입을 가장 지향하는것 또한 3가지 방법을 안다면 다 아는 사실일것입니다. 나는 한 기업에서 기술면접을 치뤘을때 DI에 관한 질문이 나왔을때 '아는거다' 라는 생각을 하며 굉장히 안도했고 자신감이 있었습니다. 자신있게 답변을 하고, 안도하고 있을때 "그럼 왜 생성자 주입을 지향하나요? 다른 방법들과 무슨 차이가 있나요? 큰 차이가 있나요?" 라는 질문이 들어왔고, 저는 당황하며 정확한 대답을 할 수 없었습니다. 그래서 다시 한번 확실히 정리하고자 합니다. DI 생성자 주입 먼저 3가지 방법을 모두 살펴보도록 하겠습니다. 1. 필드주입 위의 코드처럼 - 코드가.. 2021. 12. 14.
페치 조인(fetch join)이란? 페치 조인(fetch join)이란? SQL 조인 종류 X JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 join fetch 명령어 사용 페치 조인 ::= [ LEFT[OUTER] | INNER] JOIN FETCH 조인경로 예시 코드를 통해 fetch join에 대해 더 자세히 알아보겠습니다. fetch join을 사용하지 않을때 위의 Member, Team 예시로 설명해보자면 위처럼 fetch join을 사용하지 않고 Member를 조회하여 Team의 정보까지 확인한다면, 이처럼, 기존에 @ManyToOne 을 LAZY로 걸어놨기 때문에 Team은 프록시 객체로 불러오게 되고 그로인해 member.getTeam().getName() 메서드를.. 2021. 12. 3.
즉시 로딩과 지연 로딩 위와 같은 Member, Team 엔티티로 즉시로딩과 지연로딩을 알아보겠습니다. 지연로딩(LAZY) 단순히 그림으로만 알아본다면 Member 엔티티에서 Team 엔티티는 프록시로 걸리게되어 실제 Team 엔티티를 사용하는 시점에 DB를 조회하게 됩니다. 코드로 살펴보자면 Member 엔티티의 Team 연관관계에 LAZY를 걸어주고 위의 코드를 통해 결과를 확인하려 합니다. 결과를 먼저 예상해보자면 다음과 같습니다. Team 엔티티는 프록시 일것이고, 쿼리문에 Team을 조회하는 쿼리문은 나오지 않을것이고 ======안에 실제 Team을 사용하는 메소드가 있으므로 그 안에 Team을 조회하는 쿼리문이 나올것이다. 결과를 살펴보면, Team은 프록시 엔티티로, Member만 조회하는 쿼리문이 나오고, Tea.. 2021. 11. 27.
프록시란? 프록시 기초 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시란? 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체의 초기화 다음과 같은 코드에서 초기화를 설명하자면, Member member = em.getReference(Member.class, "id1"); member.getName(); getName(.. 2021. 11. 26.
엔티티의 생명주기 엔티티의 생명주기 1. 비영속: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태 Member member = new Member(); member.setId("member1"); member.setName("회원1"); 2. 영속: 영속성 컨텍스트에 관리되는 상태 //객체를 생성한 상태 Member member = new Member(); member.setId("member1"); member.setName("회원1"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); 3. 준영속, 삭제 - 준영속 //회원 엔티티를 영속성 컨텍스.. 2021. 11. 24.