[TIL] 로드밸런싱의 이슈 중 세션 관리문제는 어떻게 해결할까?

로드밸런싱의 이슈 중 세션 관리문제는 어떻게 해결할까? 프로젝트 중에 서버 이중화와 로드밸런싱, 세션 문제에 대해서 회의를 했었던 적이 있었다. 다시 한번 기억하고 정리를 해야겠다고 생각을 했고, 그 당시엔 redis를 사용하지 않은 환경이였지만, 이번에 정리를 하면서, redis를 왜 쓰는지 이해할 수 있었다. 일단, 하드웨어적(네트워크 장치), 소프트웨어적 로드 밸런싱에 대해 알아보자 L4 스위치와 Nginx 하드웨어적(네트워크 장치)으로 로드밸런싱 OSI 7 Layer 중에서 4계층(transport)에 해당하는 장비로 들어온 데이터를 로드밸런싱...

[TIL] 애플리케이션 대신 DB로 기능 리팩토링

서버 코드를 보고 서버의 메모리를 생각할 수 있어야 한다. // 변경 전 @Transactional(readOnly = true) fun countLoanedBookV_1(): Int { return userLoanHistoryRepository.findAllByStatus(UserLoanStatus.LOANED).size } DB에 존재하는 데이터를 모두 가져와서, 애플리케이션이 그 size를 계산한다. // 변경 후 @Transactional(readOnly = true) fun countLoanedBookV_2(): Int { return userLoanHistoryRepository.countByStatus(UserLoanStatus.LOANED).toInt() } DB로 부터 숫자를 가져와서, 적절히 타입을 변환해준다. (Long -> Int) 두 코드 중 어떤 코드가 더 좋은걸까? 겉보기에 두 기능은 완전히...

[PTJ] No space left on device 에러 발생

프로젝트 개발 서버 소스를 수정하고 빌드를 하는데 No space left on device 에러가 발생했다. 음… 이게 뭐지? 무슨 에러인지 찾아보니, 디스크 용량 문제였고, 해당 개발 디렉토리의 용량을 확인해보니 꽉찬 상태였다. 어느 디렉토리에서 용량이 많이 잡아먹는지 확인 후, 백업본과 예전에 쌓여있던 로그들을 정리했다. 다시 용량을 확인해보니 공간이 생겼고 에러를 해결했다. 리눅스 디스크 용량 확인 명령어 df -h : 디스크의 용량 확인한다. (-h : 사람이 알아보기 쉽게...

[TIL]Kafka란?

프로젝트를 하면서 카프카 대한 내용이 계속 나오면서 정리를 한번 해야겠다고 생각만 하다가 (예전에 비동기메세징이라는 것에 대해서 한번 정리를 해봤지만..) 이번에 전체적으로 정리를 해봤다. Kafka란? 아파치 카프카란 분산 환경의 유연성과 확장성을 위해 설계된 발행(Publish)/구독(Subscribe) 모델의 메세지 큐 시스템이다. Kafka와 전통적인 큐 시스템의 차이 Kafka는 클러스터로 구성되며 확장 가능한 분산 시스템으로 실행된다. 즉, 각 노드에 대한 장애 대응성을 가지고 있고, 탄력적으로 확장할 수 있어서 중심 플랫폼의 역할을...

[TIL] React - bootstrap 적용

터미널에 명령어를 입력해서 설치. 1. yarn으로 설치 yarn add react-bootstrap bootstrap 2. npm으로 설치 npm install react-bootstrap bootstrap [주의사항] yarn 또는 npm으로 설치시 index.js에 import 'bootstrap/dist/css/bootstrap.css'; 추가한다. 적용법 bootstrapk.com에서 원하는 UI를 가져와서 사용하면 된다.

[PJT] React + Springboot 토이프로젝트 - 1

React 설치 후 Spring Boot와 연동까지 해봤다. React를 공부해서 토이 프로젝트를 시작해보자. [React 설치하기] cd src/main npx create-react-app {프로젝트명} npx는 뭘까? npx는 npm 레지스트리에 올라가있는 패키지를 쉽게 설치하고 관리할 수 있도록 도와주는 CLI 도구이다. 위 명령어를 입력하니. [에러발생] npx command not found 발생했다.! [해결] node.js 공식 사이트에서 LTS버전을 다운로드하자. (설치 후 다시 입력하니 생성됨!) Node.js란? Node.js는 Javascript로 작성된 프로그램을 운영체제상에서 일반 애플리케이션 프로그램처럼 실행시켜주는 런타임이다....

[TIL] DTO

책에서는 서비스단에서 dto를 매개변수로 많이 쓰고 있는데, 규모가 커졌을때, 그리고 서로 엮었을 때를 생각하면, dto를 매개변수를 받는게 치명적일 수 있다라는 것을 듣게 된 후, Dto에 대해서 다시 한번 정리하게 되었다. DTO(데이터 전송 객체) DTO <-> Entity 어떻게 할까 ? @Getter @NoArgsConstructor @Entity public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) private long id; private String name; private String password; private String email; @Builder public User(String name,...

[TIL] IntelliJ - JIRA 연동

IntelliJ - JIRA 연동하기 File > Settings… > Tools > Tasks > Servers 경로로 이동 [+] 버튼을 클릭하여 [JIRA] 선택 설정 창에서 본인이 사용하는 JIRA URL과 계정 정보를 입력한 뒤 [Test] 클릭 [Connection is successful] 문구가 보이면 연동 완료이므로 [OK] 클릭 윈도우 기준으로 [Alt + Shift + N] 단축키를 누르면 본인에게 할당된 task를 확인할 수 있고, 브랜치명이나 Commit Message도 변경할 수 있다. 마지막으로, [Alt +...

[TIL] SQL 다국어 데이터 깨짐 현상 해결

SQL 다국어 데이터 깨짐 현상 현재 사용 중인 DB는 oracle이며, 이미 생성되어 있는 테이블에 다국어 데이터를 insert할 수도 있다고 들었다. 일단 현재 DB의 CHARACTERSET 속성을 봐야되는데 일단 조회해본다. (현재 데이터셋은 CharacterSet K016MSWIN949 이였다.) SELECT * FROM nls_database_parameters WHERE parameter LIKE ‘%CHARACTERSET%’; ру́сский язы́к라는 러시아어 데이터를 insert 후 정상적으로 데이터가 적재되었는지 확인하였으나 실제 확인된 데이터는 ?(물음표)가 포함되어 있는 비정상적인 형태로 데이터의 깨짐 현상이 보였다. 원인 분석...

[TIL] Entity 설계 시 ID값은 왜 Long일까?

토이 프로젝트를 하다가, JPA Entity 설계 시 ID값은 왜 Long으로 했나요?? 라는 질문에 나는 답을 할 수 없었다…. 왜냐하면 JPA Entity 설계시 관련 강의나 책에서 Long으로 지정하고 있어서 나는 그냥 따라서 기계적으로 만들었던거였다. ( 그땐 왜 안궁금했지? ) 왜? Entity 설계시 ID 값을 Long으로 지정하는지? 이유를 찾아봤다. int, long이 아닌 Wrapper Class(Long)를 쓰는 이유 int, long이 아닌 Wrapper Class(Long)를 쓰는 이유는 null을 사용할 수 있기...

[TIL] MethodArgumentNotValidException, ConstraintViolationException

@ControllerAdvice로 예외처리를 만들고 테스트를 하다가 @Valid는 MethodArgumentNotValidException 예외처리를 발생한다고 하던데 MethodArgumentNotValidException이 발생하지 않고 ConstraintViolationException로 계속해서 에러를 발생하고 있어서 왜 그러지…? 하고 생각을 하고 있었다. MethodArgumentNotValidException 예외는 주로 DTO 필드에 붙은 @NotNull 어노테이션과 컨트롤러 파라미터 앞에 붙은 @Valid 어노테이션을 통해 던져진다. @NotNull 어노테이션을 DTO 필드에 붙여두어도, `해당 DTO를 받아내는 메서드 파라미터 위치에 @Valid 어노테이션을 추가하지 않으면 검증이 동작하지 않는다.` 라는 글을 보게되었고.. 나는 DTO에 @NotNull과 같은...

[TIL] @ControllerAdvice

AOP를 이용한 예외처리 - @ControllerAdvice 하나의 클래스로 모든 컨트롤러에 대해 전역적으로 예외 처리가 가능함 직접 정의한 에러 응답을 일관성있게 클라이언트에게 내려줄 수 있음 별도의 try-catch문이 없어 코드의 가독성이 높아짐

[TIL] 프로젝트 방법론

토이 프로젝트를 진행하면서 프로젝트 관리는 지라 툴을 사용하기로 했다. 지라는 회사에서 프로젝트 할때 사용은 해봤지만 직접 구성을 해본적도 없어서 거의 안써본거랑 같다…. 이번 기회에 구성도 하면서 제대로 사용해보기로 했다. 맨 처음 지라를 만들때 칸반 보드와 스크럼 보드로 나뉘어졌다. 애자일 방법론을 얘기할때 꼭 나오는 것이 지라인만큼 칸반 보드와 스크럼 보드가 애자일 방법론 중에 하나인것을 알게 되었다. 이참에 프로젝트 방법론까지 정리를 해봤다. 프로젝트 방법론 1. Waterfall Model...

[TIL] 빌더패턴을 쓰는 이유

토이 프로젝트를 하면서 빌더 패턴을 사용을 하고 있는데 왜 쓰는지? 에 대해서 한번 정리를 해봤다. setter 대신 Builder Entity 클래스에는 절대로 setter를 쓰지 않는다. 그럼, 어떻게 setter가 없는데 값을 채워서 DB에 insert를 할까?? 기본적인 구조는 생성자를 통해서 값을 채운 후 DB에 insert를 한다. 값 변경이 필요하면 해당 메소드를 호출하여 변경한다. 즉, 생성자 대신에 빌더를 통해 제공되는 빌더 클래스를 사용한다. 빌더 패턴을 사용하면 어떤 필드에 어떤...

[TIL] GitHub를 통한 협업

pull, push만 해보고 제대로 사용하고 있지 않았던 git.. 이번에 프로젝트를 시작하면서 몰랐던 것들을 하나씩 정리했다. Local & Remote 편의상 로컬 머신에 존재하는 모든 repository는 local이고 GitHub에 존재하는 모든 repository는 remote라고 한다면, 우선 로컬에 repository를 만드는 방법은 위에서 말한 것처럼 크게 두 가지가 있다. A. 로컬에서 git init으로 새로운 git repository 생성 B. 깃허브에서 새로운 repository를 만든 후 git clone해서 가져오기 이렇게 만든 local과 remote는 모두...

[TIL] Integer ArrayList -> int 배열 변환

for문을 통해서 변환하는것에만 익숙해서 스트림으로 변환하는 방법을 찾아봤다. public static void main(String args[]) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); // 방법 1 int[] arr1 = new int[list.size()] for (int i = 0 ; i < list.size() ; i++) { arr1[i] = list.get(i).intValue(); // 방법 2 int[] arr2 = list.stream() .mapToInt(i -> i) .toArray(); // 방법 3 int[] arr3 = list.stream() .mapToInt(Integer::intValue) .toArray();...

[강의] 예제로 배우는 스프링 입문(IoC, DI)

IoC (제어의 역전) 일반적인 (의존성에 대한) 제어권: 내가 사용할 의존성은 내가 만든다. => 보통은 new OwnerRepository(); 생성. class OwnerController { private OwnerRepository repository = new OwnerRepository(); } IoC: 내가 사용할 의존성을 누군가 알아서 주겠지 (내가 new로 생성하지 않는다.) 1. 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤거든 상관없다. 2. 그래야 코드 테스트가 편하다. class OwnerController { private OwnerRepository repo; public OwnerController(OwnerRepository repo) { // DI :...

[TIL]Queue add VS offer

큐 관련 알고리즘 풀다가 다시 한번 정리해봤다. Queue 에러발생 추가 add(e) 삭제 remove 검사 element Queue true, false 리턴 추가 offer(e) 삭제 poll() 검사 peek() 정리 add는 큐가 꽉 찾을 때 추가 할 수 없는 경우 에러 출력 offer는 false를 리턴

[책]토비의스프링_6장_AOP

스프링 AOP 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법을 애스펙트 지향 프로그래밍 또는 약자로 AOP(Aspect Oriented Programming)이라고 한다. ( => 관점 지향 프로그래밍) AOP는 OOP를 돕는 보조적인 기술이지 OOP를 완전히 대체하는 새로운 개념이 아니다. AOP는 결국 애플리케이션을 다양한 측면에서 독립적으로 모델링하고 설계하고 개발할 수 있도록 만들어주는 것이다. AOP를 이용해 트랜잭션 속성을 지정하는 방법에는 포인트컷 표현식과 메소드 이름 패턴을 이용하는...

[알고리즘] 우선순위큐

우선순위 큐 PriorityQueue란 우선순위 큐로써 일반적인 큐의 구조 FIFO(First In First Out)를 가지면서, 데이터가 들어온 순서대로 데이터가 나가는 것이 아닌 우선순위를 먼저 결정하고 그 우선순위가 높은 데이터가 먼저 나가는 자료구조이다. 낮은 숫자가 우선 순위인 int 형 우선순위 큐 선언 PriorityQueue<Integer> priorityQueueLowest = new PriorityQueue<>(); 높은 숫자가 우선 순위인 int 형 우선순위 큐 선언 PriorityQueue<Integer> priorityQueueHighest = new PriorityQueue<>(Collections.reverseOrder()); 해당 큐의 맨 앞에 있는(제일 먼저 저장된)...