Backend

    Optional 파헤치기!

    Optional 파헤치기!

    자비스 앤 빌런즈 인터뷰 프로세스를 진행하면서 면접관님께서 “Optional.of로 왜 데이터를 저장할 때 감쌌는지” 여쭤보셨다. 나는 내가 작성한 로직 의도대로 말씀드렸지만, 실제 메서드 내부의 동작이나 어떤 파라미터가 들어오고 어떤 경우에 이를 쓰는지, 어떤 예외가 발생할 수 있는지 등등 여러가지 꼬리 질문이 들어왔고 제대로 답변 드리지 못했다. 특히, Optional을 주로 써오면서 .of().orElseThrow() 이런 방식으로 코딩을 가끔 했었는데 그동안은 예외가 발생하지 않았던 것이지 null이 들어오는 경우 반드시 NPE가 발생하는 것에 대해 면접을 통해 알게 되었다. 이를 계기로 기본적인 Optional 사용법에 대해 파악하고 앞으로는 Optional을 사용할 때 적절한 경우와 조심해서 ..

    Spring Data Jpa

    Spring Data Jpa

    EntityManager를 이용해 CRUD를 작성해보면 도메인에 상관없이 중복되는 로직이 발생한다. public Team save(Team team) { em.persist(team); return team; } public Optional findById(Long id) { Team team = em.find(Team.class, id); return Optional.ofNullable(team); } public Member save(Member member) { em.persist(member); return member; } public Optional findById(Long id) { Member member = em.find(Member.class, id); return Optional.of..

    JPQL 중급

    JPQL 중급

    경로 표현식 .을 찍어 객체 그래프를 탐색하는 것이다. 연관 필드 : 연관관계를 위한 필드 단일 값 연관 필드 : @XtoOne 대상이 엔티티이다. 컬렉션 값 연관 필드 : @XToMany 대상이 컬렉션이다. 상태 필드는 단순히 값을 저장하는 필드이며, 엔티티가 아니기 때문에 더 이상 탐색이 불가능하고 탐색의 종점이다. class Member { private String username; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } // jpql m.username ->..

    페치 조인 (Fetch Join)

    페치 조인 (Fetch Join)

    JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 한 번의 SQL로 모두 조회하는 기능이다. join fetch를 이용한다. // jpql select m from Member m join fetch m.team // SQL select m.*, T.* from Member m inner join team t on m.team_id = t.id List resultList = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member member1 : resultList) { System.out.println("member1.getUsername() = " + member1.getUser..

    JPQL 기본

    JPQL 기본

    소개 EntityManager.find → 이후 필요시 객체 그래프 탐색 검색을 하는 경우 엔티티 객체를 대상으로 쿼리를 작성해야한다. 모든 DB 데이터를 객체로 변환하는 것은 좋지 않기 때문에 필요한 데이터만 불러오기 위해 검색 조건이 포함된 SQL을 사용한다. JPQL은 객체 지향 쿼리 언어이고 엔티티 객체를 대상으로 쿼리를 날린다. (SQL은 DB 대상 쿼리) SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. List members = em.createQuery( "select m from Member m where m.username like '%kim%'", Member.class ).getResultList(); Criteria JPQL은 동적 쿼리를 만드는 것이 어렵다. 또한 ..