Study/Java&Spring 21

알아 두면 좋은 Java 기능 정리

함수형 인터페이스 - 추상메서드가 하나만 있는 경우, 두개 이상은 불가능(다른형태의 메서드가 여러개 있는건 상관 없음 오로지 추상메서드만 한개 있어야함), @FuncionalInterface 로 선언하여 사용 Java8 에서 인터페이스 - static 메서드 정의 가능, default 메서드 정의 가능 함수형 인터페이스는 순수한 함수여야 한다. 항상 같은 값에는 같은 결과값을 리턴해야한다. (=멱등해야한다.), 외부에 있는 값을 변경하면 안된다. 자바에서 제공하는 주요 함수형 인터페이스 종류 Function T 타입을 받아서 R 타입을 리턴하는 힘수 인터페이스 함수 조합용 메소드 andThen -> A.andThen(B) B 실행 결과값을 가지고 A를 수행 compose -> Acompose(B) A 실..

Study/Java&Spring 2022.04.25

JPA Flush(플러시)

플러시란? 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것을 말함 Transaction commit 이 일어날 때 flush가 동작하는데, 이때 쓰기 지연 저장소에 쌓아 놨던 INSERT, UPDATE, DELETE SQL 들이 DB에 날라간다. 영속성 컨텍스트를 비우는 것이 아니다. 쉽게 얘기해서 영속성 컨텍스트의 변경 사항들과 DB의 상태를 맞추는 작업이다. 플러시는 영속성 컨텍스트의 변경 내용을 DB에 동기화 한다. 동작 과정 변경 감지(Dirty Checking) 수정된 Entity를 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 Query를 DB에 전송 ( create, update, delete Query) flush가 발생한다고 해서 commit이 이루어지는 것이 아니고 ..

Study/Java&Spring 2022.01.17

JPA Fetch Join 튜닝

JPA를 사용하다 보면 n + 1 문제에 마주치고 바로 Fetch Join을 접하게 된다. n + 1 을 Fetch Join으로 해결하면 된다는 해결법에 집중하였지만, 정확한 원리와 Sql 언어의 Join과 다른점은 무엇인지 파악하기 위해 알아보기 위해 공부를 통해 알게 된 내용을 정리하였다. Fetch Join JPQL 에서 제공하는 성능 최적화를 위해 제공하는 기능 조회가 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 SELECT 하여 모두 영속화 Fetch Join이 걸린 Entity 모두 영속화하기 때문에 FetchType이 Lazy인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 N+1문제가 해결됨 일반 J..

Study/Java&Spring 2022.01.15

SpringBoot 조회 API

상황 Order 는 Member, Delivery 와 양방향 연관관계에 있는 엔티티다. Order를 조회하는 api를 개발할 것이다. 1. 엔티티를 노출하면서 조회하는 가장 기본적인 방식 사용 엔티티를 노출한 상태에서 조회 했을 때 생기는 문제 양방향 관계에 있는 것들이 계속 조회를 하면서 무한 루프를 돌게 된다. 예시코드 @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAllByString(new OrderSearch()); return all; } 위와 같이 엔티티를 그대로 노출하면서 조회를 하였다. 여기서 Order 는 Order -> Member (ManyToOne) Order ->..

Study/Java&Spring 2022.01.04

@Transactional Annotation 과 AOP 그리고 CGLib 와 Dynamic Proxy(JDK Proxy)

트랜잭션이란? 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미 트랜잭션은 4가지의 성질을 가지고 있다. 원자성(Atomicity) 한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리한다. 즉, 모두 성공 또는 모두 실패 일관성(Consistency) 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다. 격리성(Isolation) 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다. 영속성(Durability) 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다. Spring 에서 제공하는 @Transactional 의 기능 트랜잭션 begin, commit 을 자동으로 수행해준다. 예외 발생 시 rollback 처리를 자동으로 수행해준다. AOP를 ..

Study/Java&Spring 2022.01.03

JPA 정의와 사용

JPA를 알기전에 우선 ORM과 영속성을 알아야 한다. ORM 이란? Object-relational mapping 객체 관계 매핑 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것 객체는 객체대로 설계 RDB(관계형 데이터베이스)는 RDB대로 설계 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터 베이스는 테이블을 사용한다. ORM 장단점 장점 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중 할 수 있게 도와준다. ORM을 이용하면 SQL Query가 아닌 직관적인 코드로 데이터를 조작 할 수 있어 개발자가 객체 모델로 프로그래밍하는 데 집중 할 수 있도록 도와 준다. 선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다. 각종 객체에 대한 코드를..

Study/Java&Spring 2021.12.30

Spring MVC

Spring MVC 특징 Spring MVC 프레임 워크는 Model, View, Controller라는 모듈의 분리를 가능하게하고 애플리케이션 통합을 원할하게 처리하게 해줌 장점 코드의 가독성, 확장성, 유지보수성을 늘릴 수 있고 코드의 중복을 최소화할 수 있다. 단점 설계 시간이 오래걸리고 숙련된 개발자가 필요하며, model과 view의 완벽한 분리가 어렵다. 구조 동작 순서 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회함 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회함 핸들러 어댑터 실행: 핸들러 어댑터를 실행함 핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행함 ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 Mode..

Study/Java&Spring 2021.12.26

의존관계 자동 주입

의존관계 주입 방법 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 특징 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPoli..

Study/Java&Spring 2021.07.23

컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 스프링 빈을 등록할 떄 자바코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열하는 방식과 자동으로 주입하는 방식 두가지가 있다. 직접 빈을 일일이 등록하면 설정정보도 커지도 누락하는 문제점이 생기고 무엇보다 반복적으로 계속 적어줘야한다는 단점이 존재한다. 이를 해결하기 위해 자동주입을 한다. 컴포넌트 스캔 기능을 이용해서 자동으로 스프링 빈을 등록한다. 의존관계도 자동으로 주입하는 @Autowired 기능도 제공한다. package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotat..

Study/Java&Spring 2021.07.20

싱글톤 컨테이너

싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 객체 인스턴스를 2개이상 생성하지 못하도록 막아야함. private 생성자를 사용해서 외부에서 임의로 new키워드를 사용하지 못하도록 막아야한다. 싱글톤 패턴의 문제점 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다. 의존관계상 클라이언트가 구체 클래스에 의존한다. -> DIP를 위반한다. 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. 테스트하기 어렵다 내부 속성을 변경하거나 초기화 하기 어렵다. private 생성자로 자식 클래스를 만들기 어렵다. 결론적으로 유연성이 떨어진다. 안티패턴으로 불리기도 한다. 싱글톤 컨테이너 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로..

Study/Java&Spring 2021.07.20