분류 전체보기

    [spring]일급 컬렉션을 사용해보자

    spring 2기의 과정이 끝난지는 제법 지났지만, 아직 미션을 완료하지 못해 정리하며 진행해보려고 한다. 오늘은 받았던 피드백 중 일급컬렉션을 적용해보는 과정을 포스팅 해보려고 한다. 일급 컬렉션 객체를 도출하여 해당 객체에 비즈니스 로직의 책임을 위임해보자. 지하철 정보 관리 기능 미션을 진행하면서 구간이 추가 될 때의 비즈니스 로직을 서비스 레이어에서 처리하였는데 public SectionResponse save(Long lineId, SectionRequest request) { Line line = lineService.findLineById(lineId); Station upStation = stationService.findStationById(request.getUpStationId());..

    [DB] JDBC 란

    [DB] JDBC 란

    💡 JDBC 란? Javc Database Connectivity 의 줄임말로, DB 프로그래밍을 하기 위해 사용되는 Api 이다. 애플리케이션을 개발할 때 중요 데이터들을 주로 데이터베이스에 보관하게 되는데 JDBC 는 애플리케이션에서 데이터베이스에 접근하기 위해 사용하게 된다. JDBC Api를 사용하여 데이터 베이스에 연동할 수 있고, 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을 제공한다. ✔︎ JDBC 의 등장배경 애플리케이션 서버는 주로 TCP/IP 를 사용해서 커넥션을 연결하여 DB를 사용하게 된다. 이후 서버는 DB가 이해할 수 있는 SQL 을 연결된 커넥션을 통해 DB에 전달하게 되고 DB는 전달된 SQL 을 수행하고 그 결과를 응답해주어 애플리케이션 서버에서 활용되게 된다. ‼..

    [Jpa] JPQL

    💡 JPQL 이란 JPQL 이란 SQL을 추상화한 객체 지향 쿼리 언어를 말한다. 테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리한다. ✔︎ 예시 String jpql = "select m from Member m where m.age > 18"; List result = em.createQuery(jpql, Member.class).getResultList(); // 실행된 SQL select m.id as id, m.age as age, m.USERNAME as USERNAME, m.TEAM_ID as TEAM_ID from Member m where m.age > 18 ✔︎ 특징 SQL 을 추상화했기 때문에 특정 데이터베이스 SQL 에 의존하지 않는다. 결국 SQL로 변환되어 사용..

    [Jpa] 값 타입 컬렉션

    [Jpa] 값 타입 컬렉션

    값 타입 컬렉션을 알아보기 이전에 값 타입의 비교에 대해서 알아보자. 💡 값 타입의 비교 값 타입에서는 인스턴스가 달라도 그 안에 값이 같다면 같은 것으로 보아야 한다. primitive type 비교 int a = 10; int b = 10; // a == b (true) 임베디드(인스턴스) 비교 Address a = new Address("서울시") Address b = new Address("서울시") // a == b (false) 임베디드 타입에서는 왜 false 일까? 인스턴스가 다르기 때문에 다른 객체로 인식이 되기 때문이다. ✔︎ 동일성 비교 (identity) == 를 사용하고, 인스턴스의 참조값을 비교한다. ✔︎ 동등성 비교 (equivalence) equals( ) 를 사용하여 인스턴..

    [Jpa] 값 타입과 불변 객체

    [Jpa] 값 타입과 불변 객체

    값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이기 때문에 단순하고, 안전하게 다룰 수 있어야 한다. 임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유할 경우에는 위험하다. 대신 값(인스턴스)를 복사해서 사용할 수 있다. 하지만 누군가 실수로 값 복사를 하는 것이 아닌 기존 값을 넣는다면? ‼️ 객체 타입의 한계 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있지만 ,임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아닌 객체 타입이다. 자바 기본 타입에 값을 대입할 경우 값을 복사하지만 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없어서 객체의 공유 참조는 피할 수 없다. 기본 타입 (primitive type) int a = 10; ..

    [Jpa] 기본 값 타입

    [Jpa] 기본 값 타입

    💡 기본 값 타입 1️⃣ 엔티티 타입 @Entity 로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능하다. ex ) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다. 2️⃣ 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경시 추적이 불가능하다. ex ) 숫자 100 을 200 으로 변경하면 완전히 다른 값으로 대체되기때문에 추적이 불가능. 생명주기를 엔티티에 의존 회원을 삭제하면 이름, 나이 필드도 함께 삭제 값 타입은 공유하면 안된다. 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안됨. (사이드 이펙트 발생 - 부수 효과 발생) ✔︎ 값 타입의 분류 기본 값 타입 자바 기본 타입..

    [Jpa] 영속성 전이(CASCADE) 와 고아 객체

    [Jpa] 영속성 전이(CASCADE) 와 고아 객체

    💡 영속성 전이 (CASCADE) 와 고아 객체 특정 엔티티를 영속 상태로 만들때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용한다. CASCADE 란? 예를 들어 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하고 싶다면 사용하는 옵션이다. 부모를 저장할 때 연관된 자식도 함께 persist로 자동 호출하고 싶을 때 사용 @OneToMany (mappedBy="parent", cascade=CascadeType.PERSIST) ✔︎ 결과 💡CASCADE 의 종류 ALL: 모두 적용(모든 곳에서 사용할 때 사용) PERSIST: 영속(저장할 때만 사용할때 사용) REMOVE: 삭제 MERGE: 병합 REFRESH DETACH ‼️ 영속성 전이 사용시 주의사항 전이 되는 대상이 한 군데에서만 ..

    [Jpa] 즉시로딩과 지연로딩

    [Jpa] 즉시로딩과 지연로딩

    💡 지연 로딩 지난 시간 프록시를 설명하면서 들었던 예시에서 Member 를 조회할 때 Team 도 같이 조회되는 비효율적인 상황을 개선하기위해서 JPA 에서는 지연로딩이라는 옵션을 제공해준다. ✔︎ fetch = FetchType.LAZY fetch = FetchType.LAZY 로 옵션을 걸어주게 되면 team 을 프록시 객체로 조회한다. 이 말은 Member 크래스만 DB에서 조회한다는 말과 같다. member 를 조회할 때는 member 만 가져오게 되고 team 은 프록시 객체로 가져오는 것을 확인할 수 있다. 그리고 team에 어떤 속성을 사용하는 시점에 프록시 객체가 초기화 되면서 (쿼리가 나가면서) 값을 가져온다. 💡 즉시 로딩 반대로 Member 와 Team 을 같이 조회해야 하는 경우가..