목록코딩/JAVA (23)
거인의 코딩일지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bbE5ZQ/btsvlBpsJu8/KdQRrarSGPTa7plQ3P9lK1/img.png)
@CrossOrigin 이란? CORS(cross - origin resource sharing) 웹 페이지에서 제한된 자원을 외부 도메인에서 접근을 허용해주는 매커니즘 서로다른 도메인에서 리소스를 공유하는 방식 기존의 same - origin policy (동일 출처 정책) 와 반대되는 개념 처음 전송되는 리소스의 도메인과 다른 도메인으로 부터 리소슥가 요청 될 경우 해당 리소스는 cross- origin HTTP 요청 ex) http:www.heowc.com 이라는 사이트에서 사용하는 api 가 있는데 해당 api 는 외부에 공개하려는 목적이 아니라 자신들의 사이트에서 사용하기 위해 만들어 졌고 이 api 를 다른 사이트에서 알게되어 허락없이 무단으로 가져가 사용하게 된다면 상당히 곤란하기에 나온것이..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/26kuH/btsxghQz7M8/Tk7Exs0Ur1FDFuoHsZSYVk/img.png)
Query_DSL 이란 ?? 하이버네이트 쿼리 언어(HQL)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임 워크 정적타입을 이용하여 SQL 과 같은 쿼리를 생성할 수 있게 해준다. 자바 백엔드 기술은 Spring Boot 와 Spring Data JPA 를 함께 사용한다 . 하지만 복잡한 쿼리, 동적 쿼리를 구현하는데 있어서 한계가 있기에 이러한 문제를 해결 할 수 있는 것이 Query DSL 이다 . 자바 코드로 SQL 문을 작성 할 수 있어 컴파일시에 오류를 발생하여 잘못된 쿼리가 실행되는 것을 방지 할 수 있다. Query DSL 의 장점??? 문자가 아닌 코드로 쿼리를 작성 할 수 있어 컴파일 시점에 문법 오류를 확인 할 수 있다. 인텔리제이와 같은 IDE 의 자동완성 기능의 도움을 받을 수..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/m1iun/btsxgcn9KzF/41gCr8eojjEKoyjNtxnHEk/img.png)
BooleanBuilder 일반적으로 동적 쿼리를 사용할 때 Boolean Builder 를 사용하지만 어떤 쿼리인지 바로 예측이 가지 않는다는 단점이 존재한다 BooleanExpression 의 member.age.eq(xx) 등의 표현식을 모아서 사용할 수 있도록 해준다 BooleanExpression member.age.eq(xx) 과 같은 표현식을 의미한다 null 반환시 자동으로 조건절에서 제거된다 단!!! 모든 조건이 null 발생시 전체 엔티티를 불러오게 되므로 오류를 발생할 수 있다. // ex) BooleanBuilder @Override public List findBynamicQuery(String name, String address, String phoneNumber){ Boole..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bcuzj9/btsxgn4cmhn/mHKUNwIubRvPpkHQHWrAQ0/img.png)
JPA의 N+1 문제란?? 한번 조회해야 할 것을 N개의 종류의 데이터 각각을 추가로 조회하게 되서 총 N+1 번 DB를 조회하는 문제! 언제 발생하는가 ? JPA Repository 를 활용해 인테페이스 메소드를 호출할 시! 누가 발생시키는가 ? 1:N 또는 N:1 관계를 가진 엔티티를 조회할 때! 어떻게 발생하는가 ? JPA Fetch 전략(Fetch type) 이 EAGER 전략으로 데이터를 조회하는 경우 JPA Fetch 전략(Fetch type) 이 LAZY 전략으로 전체 데이터를 가져온 이후 연관관계인 하위 엔티티를 사용할때 다시 조회하는 경우 왜 발생하는가? JPA Repository 로 find 할 때 실행하는 첫 쿼리에서 하위 엔티티까지 한번에 가져오지 않고 하위텐티티를 사용할 때 추가로..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/yGj5J/btsrZz3uRy1/BqBQ3ZJeokunBcH1s9RM7k/img.png)
영속성 컨텍스트란? JPA 를 이해하는데 가장 중요한 용어이다. 엔티티를 영구 저장하는 환경 이라는 뜻 엔티티 매니저(EntityManager)를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리하게 된다. 엔티티 매니저 (EntityManager)? 영속성 컨텍스트는 논리적인 개념으로서 눈에 보이지 않는다 따라서 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. 엔티티 생명주기 비영속 (new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 ( managed ) : 영속성 컨텍스트에 관리되는 상태 준영속 ( detached ) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 ( removed ) : 삭제된 상태 비영속 // ..
선언적 트랜잭션 ( @Transctional ) 소스코드에 직접 트랜잭션 관련 로직을 넣어두지 않고 비지니스 로직에서 완전히 분리 하는 방식이다 프로그래밍에 의한 트랜잭션에서 나온 단점인 트랜잭션 코드 중복문제, 소스코드 유지보수의 문제를 모두 해결 가능 트랜잭션이라는 횡단 관심사를 비지니스 로직에서 완전히 분리하기 때문에 SRP 관점에서 봤을 때도 적합하고 많은양의 트랜잭션 로직을 적용하기에도 합리적 트랜잭션의 격리 수준 (Isolation Level) DEFAULT : 데이터베이스에서 설정된 기본 격리 수준을 따른다 READ UNCOMMIT 트랜잭션에서 처리 중인, 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용 Dirty Read, Non-Repeatable Read, Phantom R..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bXNR3C/btsrTPEaeEC/UgM5Um73fBven2rzXpCWz0/img.png)
JPA == Java Persistenence API, 자바진영의 ORM 기술 표준! ORM(Object Relational Mapping) 이란?? - 객체 관계 매핑 - 객체는 객체대로, 관계형 데이터 베이스는 관계형 데이터 베이스 대로 설계한다 - ORM 프레임워크가 중간에서 매핑해준다. - 대중적인 언어에는 대부분 ORM 기술이 존재한다. JPA 의 사용 이유 SQL 중심 적인 개발에서 객체 중심으로 개발 생산성 유지보수 패러다임의 불일치 해결 성능 데이터 접근 추상화와 벤더 독립성 표준 2. 생산성 (JPA 와 CRUD) • 저장: jpa.persist(member) • 조회: Member member = jpa.find(memberId) • 수정: member.setName(“변경할 이름”) ..
@NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor Spirng 과 lombok 을 사용한다면 알고 있어야 하는 생성자 관련 어노테이션들이다 3가지 다 Constructor 라는 단어로 유추 할 수 있듯 개발자 대신 생성자를 만들어 준다! @NoArgsConsructor 기본 생성자를 생성해준다. 초기값 세팅이 필요한 final 변수가 있을 경우 컴파일 에러가 발생한다 @NoArgsConstructor (force = true) 를 사용하면 null/ 0/ false 로 초기화 할 수 있다. @RequiredArgsConstructor final 변수 NotNull 표시가 된 변수 처럼 필수 적인 정보를 세팅 하는 생성자를 만들어 준다. @A..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b4Ir0g/btsrh0ZPgcW/uNczgiHNYytvRrdIPOYcM0/img.png)
Math.Sqrt()란? java.lang.Math클래스의 sqrt() 메서드입니다 double타입의 인수를 전달하면 인수에 대한 double타입의 제곱근 값을 리턴해줍니다 제곱근은 음수가 나올 수 없으므로 음수를 입력하면 NaN(Not a Number)을 리턴해준다 따라서 Math.sqrt(n) % 1 == 0 을 해준다면 제곱근이 되는 수을 알 수 있게 된다! import java.io.IOException; public class MathSqrt { public static void main(String[] args) throws IOException { System.out.println("9의 제곱근 : " + Math.sqrt(9)); System.out.println("20의 제곱근 : " +..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/N8jiP/btsqD6BMID0/y7HLVJkie6GlVHtzucKw2k/img.png)
Java 에서 String 클래스는 불변성을 가지고 있다. 그래서 변하지 않는 문자열을 자주 사용하는 경우에는 좋은 성능을 기대 할 수 있지만! 문자열에 대한 변경이 자주 일어나는 프로그램에서 String 만 사용하게된다면 효율적인 성능을 기대하기 어렵다. 문자열에 대한 변경이 자주 일어나는 프로그램에서는 StringBuilder, StringBuffer 을 사용하여 효율적인 성능을 보일 수 있다. String VS StringBuilder && StringBuffer Java에서 String 객체는 한번 값이 할당 되면 그 공간은 변하지 않는다. 하지만 StringBuilder 이나 StringBuffer 객체는 한번 값이 할당 되면 할당 된 공간이 변하는 특성을 가지고 있다. 여기서 할당된 공간이 변..