전체 글 555

자바 람다식에 대한 고찰

*람다식의 대한 고찰 람다식은 내 입장에서 다른 자바8 내용인 Optional과 LocalDateTime과 다르게 이해하기 상당히 까다로운 내용이었다. 내가 나름대로 이해한 내용을 기록으로 적어 남긴다 *stream API에서의 람다식 -사고의 시작 Map paramMap = new HashMap(); request.getParameterNames().asIterator().forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); 람다식 안에 있는 paramName은 어떻게 구분하지? 자바 코드는 뭘 가지고 판단해서 paramName을 지정하는 것이지? request.getParameter(paramNa..

Java 2021.09.23

자바 Optional

*Optional클래스 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다. 따라서 Optional클래스는 모든 타입의 참조 변수를 저장할 수 있다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널값으로 인해 발생하는 예외를 처리할 수 있게 된다. Optional 객체를 생성하기 위해서는 메서드를 사용해야 한다. Optional도 stream API 처럼 생성, 중개연산, 최종연산이 있다. *Optional 객체 생성 -Optional.of value가 null인 경우 예외가 터진다. 반드시 값이 있..

Java 2021.09.23

Spring Data JPA

*스프링 데이터 JPA *공통 인터페이스 1. 인터페이스로 repository를 만든다 2. JpaRepository를 상속받는다. 상속 받을 때 public interface MemberRepository extends JpaRepository 이렇게 상속하는데 제네릭 첫번 째 부분은 매핑할 엔티티이고 두번 째는 해당 엔티티의 PK타입이다. *메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리를 실행해주는 기능으로 파라미터가 많지않을 경우 (한두개) 해당 기능을 사용하면 좋다. public List findByName(String name); 이렇게 선언만 해주면 스프링 데이터 JPA가 메소드 이름을 분석해 JPQL을 작성해준다. 위의 예제는 select m from Member m whe..

JPA/JPA 2021.09.23

JPA를 활용한 (XToOne) Restful API설계

*Restful API 설계 앞으로 보여주는 예제들은 XToOne (ManyTonOne, OneToOne) 인 상황에서의 성능 최적화를 다루고 있다. *version1 = 응답 값으로 엔티티를 직접 외부에 노출함 @GetMapping("/api/v1/simple-orders") public List orderV1() { List all = orderRepository.findAll(new OrderSearch()); return all; } 문제점 1. 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다. 2. 기본적으로 엔티티의 모든 값이 노출된다. 3. 응답 스펙을 맞추기 위한 로직이 추가된다. (@JsonIgnore, 별도에 뷰 로직 등등) 4. 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다..

JPA/JPA 2021.09.13

org.hibernate.PersistentObjectException: detached entity passed to persist

해당 에러의 원인은 종속성 관계에 있다. 두개의 객체가 서로 관계를 가지고 있다면 (1대1, 1대다) A인스턴스에 a1, a2 B인스턴스에 b 이렇게 두개의 인스턴스의 값을 디비에 집어 넣으려는데 a1을 넣으면 b가 자동으로 디비에 입력되고 a2를 넣으면 b가 또 디비에 입력되어서 b에 해당하는 엔티티를 디비에서 이미 가지고 있기 때문에 생기는 에러다. 보통 cascade를 ALL로 설정했을 때 생기는 일이며 cascade를 없애주면 해결되는 일이다. 나의 경우에는 for문을 돌면서 중복된것을 확인하고 확인함과 동시에 insert를 했기 때문에 생긴 해프닝이었다.

오류해결 2021.09.10

Timer / TimerTask

*사용법 ①선언 import java.util.Timer import java.util.TimerTask ②초기화 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override }; ③구현 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { 반복하고싶은 코드 } }; timer.scheduleAtFixedRate(task, 1000, 60 * 1000); scheduleAtFixedRate의 첫번째 인자값은 반복하고싶은 TimeTask, 두번째 인자값은 해당 인자값 후에 실행, 세번째 인자값은 몇초단위로 반복할지 단위는 ms 즉..

Java 2021.09.06

스프링 dirty checking과 merge

*변경감지(Dirty Checking)와 병합(merge) 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. em.persist로 넣을 때 혹은 em.find 등으로 디비에서 값을 가져올 때 영속성 컨텍스트에 데이터들이 들어간다. 임의로 만든 엔티티가 식별자를 가지고 있으면 준영속 엔티티로 간주한다. 준영속 엔티티를 수정하는 2가지 방법 1. 변경감지(Dirty Checking) 2. 병합(merge) 1. 변경감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법이다. 트랜잭션 안에서 엔티티르 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경 감지가 작동해 데이터베이스에 update 쿼리가 날아간다. 2. 병합 병합의 동작 방식 1. merge()를..

Spring/Spring 2021.08.31

JPQL 중급

*경로표현식 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 select m.name -> m.name = 상태 필드 from Member m join m.team t -> m.team = 단일 값 연관 필드 join m.orders o where -> m.orders = 컬렉션 값 연관 필드 t.name = 'teamA' 상태필드 : 단순히 값을 저장하기 위한 필드 = 경로 탐색의 끝, 탐색 X 연관필드 : 연관관계를 위한 필드 -단일 값 연관 필드 (@ManyToOne, @OneToOne, 대상이 엔티티) = 묵시적 내부조인 발생, 탐색 O -컬렉션 값 연관 필드 (@OneToMany, @ManyToMany, 대상이 컬렉션) = 묵시적 내부조인 발생, 탐색 X 묵시적 조인, 명시적 조인 묵..

JPA/JPA 2021.08.26