Study 40

Java - Reflection

리플렉션(Reflection) 이란? 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법 클래스, 인터페이스, 메소들 들을 찾을 수 있게 도와줌 객체를 생성하거나 변수를 변경할 수 있음 메소드를 호출할 수 있음 위 3가지 기능을 제공하는 Java에서 기본적으로 제공하는 API 사용방식 Class c = Class.forName("클래스 이름); Class c = 클래스이름.class Method[] m = c.getMethods(); Field[] f = c.getFields(); Constructor[] cs = c.getConstructors(); Class[] inter = c.getInterFaces(); Class superClass = c.getSuperclass();

Study 2022.01.17

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

Adapter 패턴(Adapter Pattern) - 디자인패턴

Adapter 패턴 정의 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함꼐 작동하도록 해준다. Adapter의 다른의미로 Wrapper 라는 말을 사용함 방식 클래스 어댑터 객체 어댑터 클래스 어댑터 vs 객체어댑터 차이점 클래스 어댑터는 상속을 사용함 객체 어댑터는 합성을 사용함 위 그림을 보면 Adapter 가 operation()을 사용할 때 specificOperation 메서드를 호출하는데 이것이 내부 객체로 오는지 상속을 통해서 오는지의 차이가 있을뿐 동일한 형태다. 객체 어댑터 장점 상속이 아닌 구성(Composition)을 사용하기 때문에 더 유연하다. 단점 Adapter 객체를 만들어야 사용가..

Study 2021.12.24

FrontController 패턴 - 디자인 패턴

FrontController 패턴 특징 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출 MVC패턴에서 입구를 하나로 만든 형태 공통 처리가 가능함 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨 뷰에서 들어오는 모든 요청을 담당하여 웹 애플리케이션을 실행하는 모든 요청을 일괄적으로 처리할 수 있음 스프링 웹 MVC에서 프론트 컨트롤러 - 스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있다. - FrontController를 하나의 인터페이스 뿐만이 아니라 여러가지 인터페이스 호환을 위해 어댑터패턴을 적용한다. https://conpulake.tistory.com/254..

Study 2021.12.24

MVC 패턴 - 디자인 패턴

MVC 패턴(Model View Controller) 등장 배경 너무많은 역할 비즈니스 로직은 서블릿처럼 다른 곳에서 처리하고, HTML은 화면(View)을 그리는 일에 집중하기 위해 만들었다. 서블릿으로 개발할 때, 뷰(View)화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡해진다. 비즈니스 로직을 호출하는 부분에 변경이 발생해도 해당 코드를 손대야하고, UI를 변경할 일이 있어도 비즈니스 로직이 함께 있는 해당 파일을 수정해야한다. 변경의 라이프 사이클 비즈니스 로직과 UI 사이에 변경의 라이프 사이클이 다르다. 대부분의 경우 서로에게 영향을 주지 않는다. 변경의 라이프 사이클이 다른 부분을 하나의 코드로 관리하는 것은 유지보수에 좋지 않다. 기능 특화 특히 JSP 같은 뷰 ..

Study 2021.12.22