[강의]스프링 부트와 JPA 활용2 - 컬렉션 조회 최적화

컬렉션 조회 최적화 XToOne 관계에서는 fetch join으로 쿼리수를 최적화한다. 컬렉션은 fetch join 시 페이징이 불가능하다. 컬렉션은 fetch join 대신에 지연로딩을 유지하면서 hibernate.default_batch_fetch_size , @BatchSize 로 최적화한다. 권장 순서 1. 엔터티 조회 방식으로 우선 접근한다. 1. fetch join으로 쿼리 수를 최적화한다. 2. 컬렉션 최적화 1. 페이징 필요 : hibernate.default_batch_fetch_size , @BatchSize 로 최적화한다. 2. 페이징 필요X : fetch join을 사용한다. 2. 엔티티 조회방식으로 해결이 안되면 DTO조회방식으로...

Stream 간단하게 정리

코딩테스트 문제를 풀면서 stream을 많이 쓰게 되면서 stream에 대해서 간단하게 정리를 해야겠다는 생각이 들었다. stream 왜 쓰는가? 스트림은 배열이나 컬렉션(List, Set, Map)으로 원하는 값을 얻을 때 for문 도배를 방지하기 위해 나온 개념이다. 스트림은 선언, 가공, 반환 세 부분으로 이뤄진다. 보통 람다랑 많이 쓰인다. (람다란? (파라미터) -> {코드}의 구조) 선언 배열, 컬렉션(list, set, map) 등을 스트림 형태로 만든다. Arrays.stream(배열명).가공메서드(); 리스트명.stream().가공메서드(); 가공 스트림을 필요한 형태로 가공한다. 반환...

[강의]스프링 부트와 JPA 활용2 - API 개발과 성능 최적화(1)

스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의를 예전에 들었었는데 시간이 지나면서 잊어버린 부분도 있고, 들었던 것을 한번 더 들으면서 내가 부족했던 부분이나 핵심적인 부분을 정리를 다시 한번 해보기 위해서 다시 강의를 듣기 시작했다. @Controller + @ResponseBody => @RestController Entity를 외부에 노출해서는 안된다. Entity를 파라미터로 받지말고 외부에 노출해서는 안된다. Dto를 만들어준다. 지연 로딩과 조회 성능 최적화 지연 로딩 때문에 발생하는 성능 문제를 단계적으로...

토비의 스프링3.1을 읽고 - 1장 정리

제어의 역전(Inversion of Control) 성격이 다른 책임이나 관심사는 분리하자 현재 분리될 기능은 UserDao와 ConnectionMaker구현 클래스의 오브젝트를 만드는 것과 그렇게 만들어진 두개의 오브젝트가 연결돼서 사용될 수 있도록 관계를 맺어준다. 분리시킬 기능을 담당할 클래스(객체의 생성 방법을 결정하고 만들어진 오브젝트를 돌려주는 것)를 생성한다. => 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 분리한다. => `팩토리` // UserDao의 생성 책임을 맡은 팩토리 클래스 public class DaoFactory{ public UserDao...

IaaS, PaaS, SaaS

IaaS, PaaS, SaaS라는 용어는 들어봤지만 설명을 하려니 나 스스로 정리가 안된거 같아서 이번 기회에 정리를 한번 해봤다. IaaS, PaaS, SaaS? -----------SaaS 애플리케이션 데이터 -----------PaaS 런타임 미들웨어 운영체제 -----------IaaS 가상화 서버 스토리지 네트워크 IaaS(Infrastructure as a Service) : 물리적 자원 제공 ‘서비스로서의 인프라’를 뜻이며 사용자가 관리할 수 있는 범위가 가장 넓은 클라우드 컴퓨팅 서비스이다. IaaS는 고객에게 서버, 네트워크, OS, 스토리지를 가상화하여 제공하고 관리한다. IaaS는 가상화된 물리적인...

MSA 관련해서 전체적인 정리

어제 클라우드 네이티브 아키텍처라는 용어를 찾아보면서 많은 내용들이 있었다. 지금까지 했었던 프로젝트에서 나왔던 용어들을 기억하면서 복잡한 내용을 정리해봤다. 예전에 IT 트렌드는 통합,재사용으로 서 모듈이 서로 강하게 결합된 하나의 거대 시스템인 모놀리스 서비스 또는 애플리케이션이었다. 이렇게 강한 결합으로 이루어져있다보니 운영시 오류나 버그가 발생했을때 결합되어있는 모든 것을 확인해봐야하므로 수많은 시간과 비용(높은 유지보수 비용)이 들게 되었다. 이러한 문제점들로 인해 강한 결합을 느슨하게 풀기 시작했고, 서비스들이 분리되기 시작했다. 즉,...

클라우드 아키텍처란?

이번 프로젝트에서 가장 많이 들었던 단어는 MSA이다. Microservice Application라는 건 알겠지만… 정확하게 어떤것이고 무엇인지 잘 모르겠어서 구글링을 해봤다. 모놀리스 방식 예전 IT 시스템 애플리케이션 설계 패러다임은 통합(Integration)과 재사용(Reuse)이었다. 그래서 각 모듈이 서로 긴밀하게 연결된(Coupling) 하나의 거대 시스템인 모놀리스(Monolith) 서비스 또는 애플리케이션이 대부분이었다. 그러나 모놀리스 방식의 애플리케이션은 성능, 배포, 실패 시의 복구 등 여러 치명적인 문제를 가지고 있다. 운영과 유지보수가 어려운 모노리스 방식의 애플리케이션은 높은 유지보수...

메소드 참조, 생성자 참조

메소드 참조(method reference) 람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용 메소드 참조를 사용하면 불필요한 매개변수를 제거하고 다음과 같이 ‘::’ 기호를 사용하여 표현 문법 클래스이름::메소드이름 참조변수이름::메소드이름 예제 다음 예제는 두 개의 값을 전달받아 제곱 연산을 수행하는 Math 클래스의 클래스 메소드인 pow() 메소드를 호출하는 람다 표현식 (base, exponent) -> Math.pow(base, exponent); 위의 예제는 단순히 Math 클래스의 pow() 메소드로 인수를 전달하는...

리눅스 - alias

현재 등록되어 있는 별칭 보기 현재 등록되어 있는 명령어 alias(별칭) 확인 - alias 터미널에서 alias 를 입력해주면 현재 등록된 alias 리스트를 확인할 수 있다. 명령어 alias(별칭) 등록 alias 명령어별칭 = '명령어' 명령어 별칭은 alias 명령어별칭=’명령어’의 형식으로 등록 가능 unalias 명령어별칭 명령어 alias(별칭) 해제 - unalias 별칭 등록된 alias(별칭)을 삭제하고 싶다면 unalias 명령어를 사용 alias 별칭 영구등록 이렇게 등록된 alias(별칭)들은 시스템을 재부팅하고 나면 다시 초기화가 되어...

IM연동에서 SSO로 변경하고 운영에 적용 - 정리

현재 프로젝트는 IM이라는 시스템을 통해서 프로젝트 시스템 DB와 연동을 하는식으로 회원을 관리하고 있었다. 운영까지 반영을 다 했는데 문제가 발생했다. 현재는 회원들의 비밀번호 IM시스템과 연동하지 않고 프로젝트 시스템에서 초기비밀번호로 세팅을 하는 형식이였다. IM이란? IM(Identify Mangement)은 시스템별로 분산된 사용자 계정정보를 IM으로 통합적으로 관리하여 IM에서 계정정보 변경시 실시간으로 각 시스템에 연동하여 동기화를 하는 솔루션이다. 왜 비밀번호는 IM시스템과 연동하지 않았는가? 일단 비밀번호를 DB로 연동한다는것 자체가 꺼림직했고, 현재 솔루션에서는 ID와...

Entity 클래스 생성 시 올바른 어노테이션 사용법

일반적으로 많이 사용하는 어노테이션 @Getter @Setter => 문제 1. 객체가 무분별하게 변경될 가능성 있음 @NoArgsConstructor => 문제 2. 기본 생성자의 접근 제어자가 불명확함 @Builder @AllArgsConstructor => 문제3. 객체 내부의 인스턴스멤버들을 모두 가지고 있는 생성자를 생성 (매우 위험) @Entity public class Member 이 어노테이션에서 문제 3가지가 있다. 이를 개선하기 위해 어노테이션을 수정하자. 수정 1. @Setter를 사용하지 않기 Setter는 그 의도가 분명하지 않고 객체를 언제든지 변경할 수...

QueryDsl을 쓰면 좋은 이유

QueryDsl강의를 듣고 정리했다. QueryDsl 스프링부트 + 스프링데이터 JPA로는 복잡한쿼리와 동적쿼리를 해결하지 못함. querydsl를 사용해서 쿼리를 자바 코드로 작성, 문법 오류를 컴파일 시점에 해준다. @Test public void jpql() { String username = "kim" String query = "select m from Member m " + "where m.username = :username"; List<Member> result = em.createQuery(query, Member.class) .getResultList(); } @Test public void querydsl() { String username = "kim" queryFactory .select(member) .from(member)...

자바 엔터 제거, 줄바꿈 제거 정규식

rest API 연계 테스트를 하다가 오류가 나서 확인해보니 /r, /n가 문제였다..! 캐리지 리턴(CR)과 라인 피드(LF) 정규식처리를 하라고 했는데 캐리지 리턴(CR)과 라인 피드(LF)라는 용어를 처음 들어봐서 정리해봤다.. 캐리지 리턴(CR)과 라인 피드(LF) \r Carriage Return(CR) 라는 의미를 가지며 일반적으로는 맨앞으로 이동하라는 뜻입니다. \n Line Feed(LF) 라는 의미를 가지며 일반적으로는 New Line, 즉 새로운 라인이라는 뜻입니다. 자바 엔터 제거, 줄바꿈 제거 정규식 캐리지 리턴과 라인 피드를 번갈아 가면서...

테스트 주도 개발(TDD)

테스트 주도 개발(TDD) TDD란 Test Driven Development의 약자로 테스트 주도 개발이라고 한다. 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다. TDD와 일반적인 개발 방식의 가장 큰 차이점은 테스트 코드를 작성한 뒤에 실제 코드를 작성한다는 점이다. 디자인(설계) 단계에서 프로그래밍 목적을 반드시 미리 정의해야만 하고, 또 무엇을 테스트해야 할지 미리 정의(테스트 케이스 작성)해야만 한다. 테스트 코드를 작성하는 도중에 발생하는 예외 사항(버그, 수정사항)들은 테스트...

Mocking

mocking이라는 단어를 처음 들어봐서 구글링해봤다. Mock Mock이라는 단어를 사전에서 찾아보면 ‘테스트를 위해 만든 모형’을 의미한다. 테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것을 모킹(Mocking)이라고 하며, 모킹한 객체를 메모리에서 얻어내는 과정을 목업(Mock-up)이라고 한다. mocking이란 (mock = 모조품) 뜻 그대로 받아드리면 된다. 즉 테스트하고자 하는 코드가 의존하는 function이나 class에 대해 모조품을 만들어 ‘일단’ 돌아가게 하는 것이다. 한마디로, 단위 테스트를 작성할 때, 해당 코드가 의존하는 부분을 가짜(mock)로...

인증 방식 종류(쿠키,세션,토큰)

쿠키 Key, Value형식의 문자열 클라이언트가 웹사이트에 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트 브라우저에 설치되는 작은 기록 정보 파일 각 사용자마다 브라우저에 저장하니 고유 식별이 가능하다. 단점 : 요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작 당할 위험이 존재 세션 쿠키의 보안적 이슈때문에, 비밀번호 등 클라이언트의 민감한 정보를 브라우저 측이 아닌 서버에 저장하고 관리 서버의 메모리에 저장하기도 하고, 서버의 로컬 파일이나...

API, 라이브러리, 프레임워크 정리-2

REST API란? REST API : ‘네트워크’와 ‘웹’에 맞춰진 API 통신 아키텍처 REST를 잘 준수하는 API는 따로 ‘RESTful API’라고 부른다 REST API는 네트워크에서 ‘데이터’를 받아오기 위한 것이고 프로그램에서의 API는 ‘코드’, 나아가 코드뭉치인 라이브러리를 받아오기 위해 쓰는 것이다. 따라서 개발자 입장에서 구분하자면 HTTPRequest를 보내서 JSON 또는 XML 형식으로 데이터 묶음이 온다면 보통 ‘REST API’라고 보면 되고, 그게 아니고 기업에서 설명하는 방식대로 자신의 코드에 import하여 특정 함수나 메소드를...

Swagger

Swagger란? API Spec 문서를 자동화 간단한 설정으로 프로젝트에서 지정한 URL들을 HTML화면으로 확인 1.의존성 추가 build.gradle에 아래 의존성들을 추가한다. implementation 'io.springfox:springfox-swagger2:2.9.2' implementation 'io.springfox:springfox-swagger-ui:2.9.2' 2. 프로젝트에 Swagger 설정 Bean을 등록 @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() // 스웨거가 RestController를 전부 스캔을 한다. .apis(RequestHandlerSelectors.any()) // basePackage => 어디를 범위로 스캔을 할 것인지 작성 .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo...

세션클러스터링 설정을 하다가 생긴 일.(이중화란?)

세션클러스터링 설정을 하다가…. 현재 서버구성은 L4 - 로드밸런싱 알고리즘은 라운드 로빈 방식으로 되어 있고 웹서버2대(nginx) , WAS 2대(Tomcat) , DB(2개) - RAC 이중화로 구성을 한 상태이다. 로그인했을시 문제가 있어서 세션클러스터링 설정을 하고 있는데 몇줄만 추가를 해주면 될거 같았지만…. 생각처럼 금방 되진 않았고, 서버쪽 담당자님께서 이중화는 되어 있으니 세션클러스터링은 생각보다 시간이 걸리니 세션클러스터링 설정하지말고 Active-Stand by로 하자고 제안을 하셨다. 운영하는 사람들만 사용하는 시스템이다보니 많이 사용자가 많지...

JPA를 사용하는 이유

JPA ( Java Persistence API ) 자바 영속성 API 자바 진영의 ORM 기술 표준 (Object-Relational Mapping) ORM 프레임워크는 객체와 관계형 데이터베이스를 매핑한다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임(틀,체계)의 불일치 문제를 개발자 대신 해결해준다. ORM 프레임워크 : 하이버네이트 프레임워크가 가장 대중적이다. 하이버네이트를 사용하기 위해 필요한 lib => Maven jar.(dependency 추가) SQL에 의존적인 개발 회원 객체를 관리하는 MemberDAO(DAO : Data Access Object,데이터 접근 계층) 완성하고 기능 개발...