[TIL]비동기 메세징

비동기 메세징 메세징은 서비스 간 메세지를 통해 비동기적으로 주고 받는 통신 방식. 메세징은 브로커라는 인프라 서비스의 이용 유무에 따라 나뉜다.(찾아보기) 브로커 기반 메세징 모델은 송신자,메세지 채널,수신자로 구성되며 송신자와 수신자 간 메세지 채널을 통해 메세지를 교환한다. 송신자는 메세지 채널에 메세지를 쓰고 수신자는 메세지 채널에 메세지를 읽는다. 메시지란? 메시징 서비스에서 송신자와 수신자 간 교환되는 데이터 단위. 메시지는 헤더와 바디(본문)으로 구성된다. 메세지의 종류에는 document, command, event가 있고 document...

[TIL] Queue의 구현체는 왜 LinkedList일까?

스택, 큐 관련 알고리즘 문제를 풀다가 큐의 구현체는 왜 LinkedList로 만드는지 궁금해서 찾아봤다. 일단 LinkedList와 ArrayList의 차이부터 정리해보자면, LinkedList와 ArrayList의 차이 ArrayList는 index가 있고, LinkedList는 각 원소마다 앞,뒤 원소의 위치값을 가지고 있다. 이러한 각각의 특징은 조회, 삽입, 삭제시에 성능의 차이가 발생된다. ArrayList ArrayList는 기본적으로 배열을 사용한다. 하지만 일반 배열과 차이점이 존재한다. 일반 배열은 처음에 메모리를 할당할 때 크기를 지정해주어야 하지만, ArrayList는 크기를 지정하지 않고 동적으로...

[책]스프링 부트와 AWS로 혼자 구현하는 웹 서비스

스프링 부트에서 테스트 코드를 작성하자 TDD와 단위테스트는 다른 이야기이다. TDD는 테스트가 주도하는 개발이다. 테스트 코드를 먼저 작성하는 것부터 시작이다. 단위테스트를 배우기 전 1. 코드를 작성 2. 프로그램(tomcat) 실행 3. Postman과 같은 API테스트 도구로 Http 요청 4. System.out.println() 눈으로 검증 5. 결과가 다르면 프로그램(tomcat) 중지 후 코드 수정 2~5번은 매번 코드를 수정할때마다 반복해야한다. 테스트 코드를 작성하면 자동검증이 가능하고 [중요] 새로운 기능을 추가했을 시 기존 기능이 잘...

[프로젝트]WEB취약점 U-12, U-29

프로젝트 진행을 하다가 WEB취약점 U-12, U-29가 발견됐다고 해서 조치를 해야하는데 처음 들어보는 문제들이라서 구글링을 하면서 하나씩 해결해봤다. U-12(하) 계정이 존재하지 않는 GID 금지 ○ 점검개요 : 그룹(예 /etc/group) 설정 파일에 불필요한 그룹 (계정이 존재하지 않고 시스템 관리나 운용에 사용되지 않는 그룹, 계정이 존재하고 시스템 관리나 운용에 사용되지 않는 그룹 등)이 존재하는지 점검 ==> 해당 그룹 삭제. groupdel [그룹명] ex) groupdel printadmin U-29(상) 접속 IP 및...

[알고리즘]유클리드 호제법

유클리드 호제법으로 최대공약수 구하기 최대공약수(GCD, Greatest Common Divisor) private int GCD(int x, int y) { if(y == 0) { return x; } else { return GCD(y, x % y); } } 1. GCD(22, 8)로 실행 2. GCD(8, 22 % 8) -> GCD(8, 6) 3. GCD(2, 6 % 2) -> GCD(2, 0) 4. 매개변수 y의 자리에 0 => if문 조건에 걸림 5. return x; (x의 값이...

[강의]스프링 부트와 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)로...