전체 글

프로세스 동기화 (Process Synchonization)
프로세스 동기화 영화 좌석을 예매할 때 하나의 좌석에 동시에 여러 사람이 접근할 수도 있다. 이 때, 좌석에 대해 동기화 문제가 해결되지 않는다면, 한 좌석을 여러사람이 예매하는 문제가 발생할 것이다. 프로세스 동기화는 여러 개의 프로세스(스레드)가 컴퓨터 내의 공유된 리소스에 접근하는 경우에 데이터의 일관성을 유지하기 위한 방식을 의미한다. 경쟁 상태 (Race Condition)과 임계 영역(Critical Section) 은행을 예시로 생각해보자. 은행에서 하나의 계좌에는 입금과 출금을 할 수 있다. 만약 동시에 하나의 계좌에서 입금과 출금이 동시에 이뤄진다면 어떻게 될까 ? 현재 Zayson의 통장에는 잔고가 1000원 남아있다. Process A가 1000원을 입금했다. 동시에 Process B..

RestTemplate
API를 개발하다보면 외부 API 서비스 혹은 다른 서비스 API를 호출해서 데이터를 송,수신 해야하는 경우가 있다. RestTemplate는 Spring 3부터 지원하기 시작한 “동기 방식"의 REST API 호출 방법이다. Http 요청을 작성할 수 있는 템플릿으로서 json, xml 데이터를 Jackson과 함께 간단하게 파싱해서 사용하는 것이 가능하다. Spring 4부터는 비동기 방식인 AsyncRestTemplate를 지원하기 시작했고, 최근 Spring 5부터는 기존의 동기 방식을 포함할 뿐만 아니라 비동기, 넌블로킹 방식도 WebClient를 지원하기 시작했다. 메서드 RestTemplate의 메서드는 아래와 같다. 1. getForObject : GET 메서드를 이용해 요청한 URL로부터..

Converter를 이용해 URI에 Enum 타입 매핑하기
현재 프로젝트에서 사용자가 자신이 수신한 공지사항, 이벤트, QNA, 파티 매칭 관련한 알림을 필터링 해서 읽을 수 있는 기능을 구현하고 있다. 이 때, URI를 “/notify/{notifyType}” 으로 지정하고 String 타입이 아닌 정의한 Enum 타입으로 받는다면 Stirng 타입에서 Enum타입으로 변경하는 추가 로직을 구현없이 편하게 비즈니스 로직에 접근할 수 있다고 판단했다. 물론 URI의 의미 전달까지 제대로 전달할 수 있다고 생각했다. 그래서, URI 엔드포인트에 들어가는 PathVariable 값을 String 값으로 받는 것이 아닌 바로 정의한 Enum 타입으로 받아보는 방법을 정리하고자 한다. Converter? Spring에서 제공하는 Converter를 먼저 간단하게 확인해..

반정규화 (De-Normalization)
정규화의 목적은 테이블 간 중복 데이터를 최소화하는 것이었다. 제 1 정규화 부터 제 5 정규화까지 단계를 거치며 테이블을 구체적으로 분해하게 되고, 이는 테이블 간 발생할 수 있는 이상 현상들을 제거하고 무결성을 유지할 수 있게 하는 장점이 있다. 하지만 단계를 거치며 중복을 제거하기 때문에 많은 테이블로 분리가 되기 때문에 데이터를 조회하기 위해선 테이블 간 Join 연산이 늘어나 조회 성능이 낮아지는 단점이 있다. 반정규화(De-Normalizaiton)은 성능 향상, 개발 편의성 등을 위해서 정규화된 테이블 규칙을 의도적으로 위반하는 것을 의미한다. 비정규화와 반정규화? 비정규화는 정규화가 되지 않은 테이블 모델을 지칭하는 단어이고, 반정규화는 정규화 원칙을 의도적으로 위반하는 것을 의미한다. 즉..

정규화 (Normalization)
하나의 테이블에 다양한 애트리뷰트를 혼합해서 사용한다면 데이터가 중복해서 저장될 수 있고, 이는 다양한 갱신 이상을 발생시킨다. 삽입 이상 : 원하지 않는 데이터가 삽입 되거나 필수적으로 삽입할 데이터가 부족해 삽입이 되지 않는 문제 현상을 말한다. 삭제 이상 : 하나의 데이터만 삭제하고 싶지만, 해당 데이터 전체가 포함된 튜플이 삭제됨으로써 원하지 않는 데이터가 삭제 되는 문제 현상을 말한다. 수정 이상 : 튜플의 일부분만 수정되어 데이터의 의미가 모호해지거나 일관성이 사라지는 문제 현상을 말한다. 정규화(Normalization)의 기본 목적은 테이블 간 중복 데이터를 최소화 시키는 것이다. 중복 데이터를 최소화 시킴으로써 데이터의 무결성 또한 유지되며 다양한 갱신 이상들을 해결할 수 있다. 그리고,..
![[백준, Java] 10775번 : 공항](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7gdfb%2FbtrFkYigZLZ%2FDAkUrekJfKGtiwD9mremvK%2Fimg.gif)
[백준, Java] 10775번 : 공항
🔗 문제 링크 https://www.acmicpc.net/problem/10775 😮 문제 해결 방법 문제에서 비행기가 순서대로 도착할 예정이고 각 비행기의 값은 1부터 해당 값까지의 게이트에 도킹할 수 있는 것을 의미한다. 자신의 순서에 비행기가 도킹할 수 없을 때까지 개수를 세준다. 비행기가 도킹할 수 있는 게이트를 찾기 위해서 Union-Find를 이용한다. 게이트 배열을 자신의 게이트로 초기화를 하고, 해당 값의 비행기가 도킹되면 다음에 도킹될 동일한 값의 비행기는 현재 게이트보다 하나 작은 게이트로 도킹되어야 한다. 예를 들어, 게이트가 4개이고 아무 비행기도 게이트에 도킹되지 않았다면 게이트 배열은 1,2,3,4값을 가질 것이다. 3번 비행기가 3번 게이트에 도킹되면 이 후에 들어오는 3번 비..

java.lang.UnsupportedOperationException 에러
상황 Service 로직 테스트 코드를 작성하는 도중 findNotice.getNoticeImages().clear(); 부분에서 에러가 발생하는 것을 확인했다. 문제 파악 테스트 코드를 작성하기 위해 Builder를 작성하는 도중 List 타입 데이터에 대해 new ArrayList형식이 아닌 Arrays.asList 방식으로 데이터를 초기화 했다 private Notice testNotice() { return Notice.builder() .noticeId(1L) .title("title") .noticeDetail("detail") .regYmd(LocalDateTime.now()) .noticeImages(Arrays.asList(testImage(1L, "test1"), testImage(2L..

3-Way-Handshake, 4-Way-Handshake
3-Way-Handshake와 4-Way-Handshake는 각각 TCP가 서로의 연결을 논리적으로 성립시키고 해제 시키는 과정을 의미한다. 3-Way-Handshake TCP는 서버와 클라이언트 사이에 데이터를 전송하기 위해 데이터 전송 전 서로의 연결을 3가지 단계를 이용해 성립시킨다. 연결하고자 하는 A가 B에게 연결 요청을 한다. B는 연결요청을 받았으니 A에게 연결 요청을 수락한다는 응답과 연결 요청을 보낸다. A는 B의 연결 요청을 수락한다는 응답을 B에게 보낸다. 각 단계를 구체적으로 알아보자. 연결하고자 하는 A가 B에게 연결 요청을 한다. 클라이언트 A는 서버 B와 연결을 하고싶다. 클라이언트 A는 연결하고자 하는 서버 B에게 연결을 요청하는 SYN 패킷을 전송한다. 연결이 없던 클라이언..