전체 글 87

OSIV

Open Session in View : JPA에서 영속성 컨텍스트의 생존 범위를 어디까지 설정할지 처리하는 패턴. 따로 설정해놓지않으면 기본값은 true로 되어있다. true인 경우 Open Session in view 이름 그대로 Spring에서 View를 반환할때 까지 영속성 컨텍스트가 생존한다. 컨트롤러 계층에서 지연로딩 초기화가 가능하단 이야기. 이 경우의 장점은 앞서 말한 영속성 컨텍스트의 생존 범위가 대략 인터셉터부터 리파지토리까지 요청을 받고 응답을 보낼때까지 살아있기때문에 코드 작성이 수월해진다. 어느 계층에서던 Entity를 조회하거나 초기화 할 수 있다. 단점으로 그만큼 요청이 처리되는 긴 시간동안 데이터베이스 커넥션을 계속 가지고있기에 웹 어플리케이션 성능에 문제가 생길 수 있다. ..

공부/JPA 2023.12.18

암호화 Encode / Encrypt / Hash

최근 스프링 시큐리티 강의를 들으면서 사용자의 비밀번호를 암호화 할 때 Hash 암호화 방식을 사용해야하는지 배웠다. 간단하고 짧게 복습하자는 의미에서 글을 남긴다. 암호화방식에는 크게 3가지가 존재한다. 1. Encode 2. Encrypt 3. Hash 1. Encode 대표적으로 Base64를 통해 암호화 하는 방식. 공개적인 암호화 방식으로 암호화를 진행하므로 어떠한 알고리즘을 사용했는지만 알 수 있다면 쉽게 복호화가 가능하다. 그때문인지 비밀번호라던가 유출에 크리티컬한 정보는 Encode 방식으로 암호화 하지않고 주로 이미지, 동영상 업로드에 사용된다. 2. Encrypt Encode방식에서 조금 더 진화된 형태로 Key가 들어간다. 암호화된 데이터를 복호화할때 Key가 없다면 복호화가 불가능...

공부/Security 2023.12.17

Collection fetch Join (~~ toMany 관계)

어제 공부하면서 배운 ~~toOne 관계는 Collection이 아닌 객체 한개를 조회하기때문에 fetch Join을 사용하면 큰 문제는 없었다. 이번 강의에서는 ~~toMany 관계가 포함된 Order 를 조회하면서 문제점과 해결방안에대해 알아봤다. 우선 toOne관계와 똑같이 fetch Join이 들어간 방식이 DB에 쿼리를 어떻게 전송하는지와 응답한 JSON을 살펴보자. 기존 처럼 fetch join을 이용해 get요청을 했더니 첫번째 문제가 발생했다. JSON에 중복된 데이터가 응답됬다. 이유가 뭘까 Hibernate가 DB에 전송한 쿼리를 H2에 날려 어떤 테이블 형식을 가지는지 봤더니 1개의 Order를 조회할때 Order가 ~~toMany 관계로 가지고있는 OrderItem 2개를 join하..

공부/JPA 2023.12.16

6장 객체와 자료 구조

변수를 private으로 하는 이유 다른 사람들이 변수에 의존하지 않게 만들기위해 최초 개발의도에 맞지않게 변수가 다른 개발자에의해 수정될 수 있다. 그렇다면 왜 getter와 setter는 public으로 공개해 외부에 노출하는걸까? → 내부 구조를 노출하지않고, 함수를 통해 객체를 다루기위함 디미터의 법칙 모듈은 자신이 조작하는 객체의 내부 구조를 몰라야한다. “Class C의 Method F는 다음과 같은 객체의 메서드만 호출해야한다.” 클래스 C F가 생성한 객체 F 인수로 넘어온 객체 C 인스턴스 변수에 저장된 객체 쉽게말한 친구들은 가까이하고 낯선이는 경계하자는 이야기. 기차 충돌 final String outputDir = ctxt.getOption().getScratchDir().getAb..

책/CleanCode 2023.12.16

JPA N + 1 과 FetchJoin

JPA 강의를 보고 복습 겸 남겨보는 JPA N+1문제와 해결방법인 FetchJoin 우선 첫번째 조회 API 방식은 fetchJoin을 사용하지않고 DTO로 변환 후 응답하는 방식 지연 로딩을 DTO Class에서 getter로 초기화하며 원하는 값들을 가져오기엔 성공했지만, 1개의 Order를 조회할때 쿼리가 한번 Lazy된 Member를 조회할때 또 쿼리가 한번 Lazy된 Delivery를 조회할때 또또 쿼리가 한번 여기서 두개의 Order를 조회한다면 DTO에서 지연로딩을 초기화 하는과정에서 또 Member와 Delivery 값을 가져오는 쿼리가 날라가 Memeber, Delivery에 관한 쿼리가 총 4개가 날라간다. 이는 성능 저하 이슈로 이어진다. 1개의 쿼리를 조회할때 + N 개의 쿼리가 ..

공부/JPA 2023.12.15

@WebMvcTest에 대한 고민

Presentation Layer의 단위 테스트를 진행할 때 @WebMvcTest 를 이용해 컨트롤러와 관련된 Bean들만 띄워서 가볍게 단위 테스트를 진행할지 or @SpringBootTest 를 이용해 Service 및 Repository Bean들도 같이 띄워서 통합테스를 진행하지 고민이 많이됬다. @WebMvcTest 를 이용할 경우 andExpected 단계에서 Response의 Body가 담겨오지 않게된다. (실 서비스를 실행하지않고 Mockit의 verify() 메서드를 이용해 서비스 메서드가 실행됬는지만 검증하기때문에) 서비스가 제대로 실행되고 응답값을 검증하고싶어 방법을 구글링했더니 Mockito.when()을 많이 사용하는거같아 테스트코드에 적용시켜봤다. 응답값은 잘 넘어는것을 확인했지..

5장 형식 맞추기

프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야한다. 팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야한다. 형식을 맞추는 목적 코드 형식은 너무나도 중요하지만 또 너무 맹목적으로 따르면 안된다. 코드의 형식은 의사소통 의 일환. 의사소통 은 개발자의 1차적인 의무 적절한 행 길이를 유지하라 Junit , Tomcat 등… 대부분의 프로그램의 Java 파일의 평균 길이(행) 은 65줄이다. 하나의 클래스에 500줄…400줄이 넘지않아도 규모가 큰 프로그램을 작성할 수 있다. 신문기사처럼 작성하라 이름은 간단하면서도 설명이 가능하게 짓자. 소스 파일 첫 부분은 고차원 개념과 알고리즘을 설명하고 아래로 내려갈수록 모듈의 의도를 자세하게 설명하자. 마지막에는 가장 저차원적인 함수와 세부 내역..

책/CleanCode 2023.12.14

상속

OOP 의 핵심중 하나 다형성의 기반 is-a 관계 부모 클래스 멤버 변수가 private 일때 자식클래에스에서 부모 클래스 멤버변수에 접근하고 싶다면 protected로 바꿔주면 된다. 외부 클래스는 접근할 수 없음 클래스 내부,같은 패키지에 속한 클래스,자식 클래스만 접근가능 is-a관계 상속관계 수학에서 부분 집합 관계 A student is a Person has-a관계 컴포지션 관계 가지고있는(포함) 관계 Casting 부모 ← 자식 암시적 캐스팅 Person 이 부모 Student 가 자식일 때 Student s1 = new Student(); Person = (Person) s1; // (person)생략가능 컴파일러가 해줌. 캐스팅은 형제간에 불가능하다 (부모 자식간에만 가능.) insta..

공부/OOP 2023.12.13

Singleton

어떤 클래스에서 만들 수 있는 인스턴스 수를 하나로 제한 하는 패턴 다음과 같은 조건을 충족하는 객체에 적합 프로그램 실행중 최대 하나만 있어야함. 프로그램 설정, 파일 시스템 등.. 이 객체에 전역적으로 접근이 가능해야함. 특징 private 생성자 static 메서드를 통해서만 객체를 얻어올 수 있음. 아직 객체가 없는 경우 객체를 생성한 후 static변수에 저장 static 변수에 저장된 객체를 반환 객체가 있는 경우 static 변수에 저장된 객체를 반환. 예시 코드 public class Singleton{ private static Singleton instance; private Singleton(){ //private이기에 여기서 new 생성자를 하지 못함. get메서드를 통해야 생성 가..

공부/OOP 2023.12.13

Static

Static method: new를 이용해서 개체를 만들지않고 메서드를 호출한다 클래스: 개체보다 상위 개념에 있는 것. 클래스: 공장의 개념 개체 : 공장에서 찍어낸 제품의 개념 이라 생각하면 쉽다. public void method1(){} 은 개체의 메서드 public static void staticMethod(){} 는 클래스의 메서드 스태틱 메서드에서는 스태틱 필드값만 접근할 수 있다. 정적메서드에서 비정적 값에 접근 불가 왜냐, 비정적값은 개체에 속한 멤버이기 때문 개체수 만큼 멤버 변수가 생기는데 클래스는 단 하나기 때문. 스태틱 메서드에서는 수많은 개체 중 어떤 값을 가져올지 특정할 수 없다. 다만 비정적 → 정적으로 접근은 가능~

공부/OOP 2023.12.13