Spring Scheduled

현재 회사에서는 리눅스 cron으로 스케쥴을 관리하고 있는데, 스케쥴이 필요한 새로운 개발 건이 생겼다. 이번 기회에 리눅스에서 실행하는 것이 아니라 스프링 스케쥴을 사용해서 개발을 해봐야겠다는 생각이 들었고, 스프링 doc과 구글링을 통해서 스프링 스케쥴로 개발을 할 수 있었다.(현재까지 운영에서 이상없이 잘 돈다!) 스프링 스케쥴을 하면서 정리했던 개념과 테스트 코드를 작성해보자. Cron 표현식 Cron 표현식을 사용해서 작업을 예약할 수 있다. // 매 10초마다 실행 @Scheduled(cron = "*/10 *...

데이터를 주고 받을 때, Map을 지양하는 이유

map 사용을 지양하는 이유? 데이터를 주고 받는데 있어서 Map은 지양하고 있다. 고정타입 문제 캐스팅 문제 컴파일 에러가 발생 안하는 문제 사용처가 불분명해지는 문제 응답 필드에 뭐가 들어가는지 알 수 없는 문제 불변성문제 관련 링크 https://hodolman.com/32 https://mangkyu.tistory.com/164 https://velog.io/@jin0849/DATA-%EC%A0%84%EB%8B%AC-MAP-VO-DTO

WebClient란?

WebClient란? webClient는 spring 5에서 부터 등장한 HTTP 클라이언트 라이브러리이다. 여기서 말하는 HTTP 클라이언트라고 하는 것은 HTTP 프로토콜을 이용하여 서버와 통신하는 것을 의미 ==> 즉, 서버에 API 요청을 보내는 주체이며 다른 서버와 통신하기 위해 사용한다. WebClient가 등장하기 이전까지는 spring에서 자주 사용되던 HTTP 클라이언트로 restTemplate 사용. WebClient가 등장한 이후로는 WebClient의 사용을 권장하고 있습니다. RestTemplate과 비교했을 때 WebClient가 가지는 장점들은 다음과 같이 있습니다. - 비동기적으로 요청하는 non-blocking 처리...

Homebrew를 통해 Docker를 설치

Homebrew란? 루비로 개발된 Mac 용 패키지 관리 애플리케이션으로 macOS 운영 체제의 소프트웨어 설치를 단순하게 만들어준다. (명령어 한줄이면 생성/삭제가 가능하다.) 홈브루 공식 사이트 https://brew.sh/index_ko 에서 명령어를 통해서 설치할 수 있다. brew를 통해서 설치 명령어 brew install –cask docker 명령어를 실행하면 Application에 docker가 생성된다. cask docker를 설치할 때도 역시 brew install docker 명령어를 사용하는데 여기서 –cask 옵션을 줄 수 있다. cask 옵션을 주게 되면 Docker Desktop on...

동시성 문제와 해결방법

동시성 문제가 발생하는 이유는 동일한 자원에 여러 스레드가 동시에 접근했을때 발생하는 문제이다. 이러한 동시성 문제는 지역 변수에서는 발생하지 않는다. 지역 변수는 스레드마다 각각 다른 메모리 영역이 할당되기 때문입니다. 동시성 문제가 발생하는 곳은 같은 인스턴스 필드(주로 싱글톤) 또는 static 같은 공용 필드에 접근할 때 발생한다. 여기서 중요한 점은 값에 무조건 동시에 접근한다고 문제가 발생하는 것이 아니라 값을 어디선가 변경할 때 발생! 즉, 읽기만 한다면 동시성 문제는...

데이터베이스 - LOCK

락은 왜 필요할까? 한정판으로 1개의 신발을 판매하고 있는데 두명의 사용자가 동시에 접근하게 된다면? -> 커머스 서비스에서 이러한 일이 발생한다면 치명적 동시성 제어가 필요하다. 트랜잭션이 동시에 수행될때 일관성을 해치지 않도록 하는 DBMS의 기능 동시성제어는 어떻게 할까? 락으로 한다. 락에는 낙관적잠금, 비관적잠금 낙관적 잠금은 데이터 갱신 시 경합이 발생하지 않을 것이라고 보고 한 사용자가 업데이트 완료하면, 동시 업데이트를 시도하는 다른 사용자들에게 충돌이 있음을 알리고 롤백시킨다. A사용자 ->...

프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍 정리

프로그램 컴퓨터가 실행할 수 있는 명령어들의 집합 프로세스 컴퓨터에서 실행 중인 프로그램 각각의 프로세스는 독립된 메모리 공간을 할당 받음 CPU 명령어를 실행하는 연산장치 메모리(==메인 메모리) 프로세스가 CPU에서 실행되기 위해 대기하는 곳 IO 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것 입출력 장치(마우스,키보드)와 데이터를 주거나 받는 것 단일 프로세스 시스템 한 번에 하나의 프로그램만 실행됨 단점 : cpu의 사용률이 좋지않음 -->p1-->I/O-->p1--I/O ... (IO가 끝나야 p1프로그램...

String, StringBuilder, StringBuffer에 대해서 정리

String 특징 new 연산을 통해 생성된 인스턴스의 메모리 공간은 변하지 않는다 (Immutable) GC로 제거해야 한다. 객체가 불변하므로 멀티쓰레드에서 동기화를 신경 쓸 필요가 없다.(조회연산에 장점) 즉, 문자열 연산이 적고 조회가 많은 멀티쓰레드 환경에서 좋다. StringBuffer, StringBuilder 공통점 new 연산으로 클래스를 한 번만 만든다.(Mutable) 문자열 연산 시 새로 객체를 만들지 않고 크기를 변경시킨다. StringBuffer, StringBuilder 차이점 StringBuffer는 Thread-Safe함 StringBuilder는 Thread-safe하지 않음 (불가능) Thread-safe 멀티 쓰레드 프로그래밍에서, 어떤...

자바의 메모리 구조, 프로세스, 쓰레드, String에 대해서 정리

자바 메모리 구조 Java Virtual Machine, 즉 자바 가상 머신의 약자 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다. JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static) 영역, Stack 영역, Heap 영역으로 구분한다. JVM은 Java와 OS(운영체제) 사이에서 중개자 역할을 수행하여 Java가 OS(운영체제)에 구애받지 않고 독립적으로 작동이 가능하다. 또한 가장 중요한 메모리 관리, Garbage collection(가비지 컬렉션)을 수행한다....

사용자는 명시적으로 로그아웃을 하지 않는데, 로그아웃을 했는지 서버는 어떻게 알 수 있을까?

대부분의 사용자는 직접 명시적으로 로그아웃을 누르지 않는다. 보통 웹브라우저를 종료할 뿐인데, HTTP는 비연결성이기에 서버측에서는 클라이언트가 웹 브라우저를 종료했는지 알 수 없다. 그렇기 때문에 세션을 언제 삭제할지 판단하기 어렵다 삭제하기 싫어서 계속해서 유지를 한다면 !?? 세션은 기본적으로 메모리에 생성되는데 사용하지 않는 세션이 관리되지 않으면 성능저하가 발생하고, JSESSIONID를 탈취당한 경우 시간이 흘러도 해당 쿠키로 악용될 수 있다는 문제점이 있으니 어쨌든 삭제는 필요하다! (세션 타임아웃) 이런 이유로 세션...

Today I Learned.

이론적인 내용을 설명하는 게 정말 어렵다는 것을 느꼈던 하루였다. 알고 있었던 내용이나 몰랐던 내용을 정리해보는 시간을 갖고, 다시 한번 정리해보면서 오늘 정리했던 내용은 완벽하게 설명할 수 있을때까지 말하면서 공부해보자! JWT특징 - Json Web Token의 줄임말로 권환 확인, SSO에서 널리 사용되는 기술이다. - 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달하는 방식. - .을 기준으로 총 3가지로 구분이 된다 - Header...

프리온보딩 백엔드 챌린지 6월 - 1주차 후기 및 내용 정리

JVM부터 GC, 스레드 동기화까지의 내용을 2주간 월, 수 (19:30 ~ 22: 30) 총 3시간동안 강의 및 미션 수행을 하는 챌린지 일정이다. 이번 챌린지의 목표는 강의를 통해 프로그래밍 언어에 대한 이해도 높이기. 나아가 언어 뿐 아니라 어떠한 기술이든 깊게 살펴보는 습관 만들기. 이였고, 아는 내용은 다시 한번 정리해보자는 느낌으로 시작했다. 첫 강의는 자바의 정의와 동작 방식에 대해서 자세히 살펴보는 시간이였다. 자바 JDK LTS 버전인 17버전을 기준으로...

AWS Summit Seoul 2023 후기

이번 AWS Summit Seoul 2023은 코엑스 몰에서 5월 3일(수), 5월 4일(목) 이틀동안 진행됐다. (그동안 코로나로 인해서 3년동안 오프라인으로 진행하지 못했다..!!) 이번 행사에서 최신 IT 트렌드 및 솔루션에 대한 다양한 주제로 세션 발표가 있었다. 아침 10시쯤에 도착했었는데 정말 많은 사람들이 있어서 아예 듣지 못하는 세션도 생겼었다… 가장 관심이 있었던 세션과 기억에 남는 세션은 대용량 트래픽, 쿠팡의 DB 엔지니어가 클라우드를 사용하는 방법 과 RDS vs Aurora 비교...

[TIL] 코딩테스트 필요한 내용 정리

키 가져오기 for (String key : map.keySet()) { System.out.println(key); } 값 가져오기 값만 가져오고 싶은 경우 values() 메서드를 사용합니다. for (String key : map.values()) { System.out.println(key); } Java 8 이후부터는 List에서는 sort() 메소드를 호출하여 정렬할 수 있습니다. list.sort(Comparator.naturalOrder()); // 오름차순 list.sort(Collections.reverseOrder()); // 내림차순 answer = list.stream().mapToInt(Integer::intValue).toArray(); // list => int[]배열에 값 넣기 정렬 // ArrayList 준비 ArrayList<String> list = new ArrayList<>(Arrays.asList("C", "A", "B", "a")); System.out.println("원본...

[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로 작성된 프로그램을 운영체제상에서 일반 애플리케이션 프로그램처럼 실행시켜주는 런타임이다....