전체 글 361

Network - TCP 통신 이해하기!

TCP 통신이란? 네트워크 통신에서 신뢰적인 연결방식 Unreliable network에서 Reliable network를 보장할 수 있도록 하는 프로토콜 Network congestion avoidance algorithm(혼잡 방지 알고리즘)을 사용한다. Reliable network Reliable network를 보장한다는 것은 아래 4가지 문제를 해결한다는 것을 의미한다. 손실: Packet이 손실될 수 있다. 순서: packet의 순서가 바뀔 수 있다. 혼잡: 네트워크가 혼잡하다. 과부하: Receiver(수신자)가 과부하 될 수 있다. TCP는 이러한 문제를 흐름 제어와 혼잡 제어 2가지 기법으로 해결한다. 흐름 제어 흐름 제어에 대한 설명이다. 흐름 제어는 송신측과 수신측의 데이터 처리 속..

Operation/Network 2022.10.03

자료 구조 - 레드-블랙 트리(Red-Black Tree)를 왜 사용할까?

레드-블랙 트리(Red-Black Tree)를 왜 사용할까? 레드 블랙 트리(Red-Black Tree)는 어떤 목적을 위해서 사용할까? 알아보자. 먼저 자바의 TreeSet과 TreeMap은 레드-블랙 트리를 베이스로 한 구현을 사용한다. 우리가 트리에 저장하는 절차를 살펴보자. 트리 일반적인 트리 구조에서는 삽입할 데이터 n이 있을 때 부모 노드부터 탐색하면서 삽입한 데이터보다 n이 해당 노드보다 작으면 왼쪽 노드에, 해당 노드보다 크면 오른쪽 노드에 저장한다. 그럼 데이터 1, 2, 4, 8이 저장되면 어떻게 될까? 편향 이진 트리가 된다. 배열로 표현하면 공간도 많이 소모될 뿐 아니라 탐색하는데 시간 복잡도 O(n)이 소모된다. 이러한 현상을 막으려면 중간중간에 재배열을 해서 위와 같이 시간복잡도..

Language/Algorithm 2022.09.30

Network - HTTP 1.1과 HTTP 2.0의 차이

HTTP 1.1 버전은 15년 동안 지속되었습니다. 하지만 하나의 웹사이트에 무수한 리소스가 존재하고 무수한 요청을 주고 받게 되면서 HTTP 1.1이 가진 문제점이 대두되면서 HTTP 2.0이 등장했습니다. HTTP 1.1과 HTTP 2.0의 차이점을 HTTP 1.1(기존)의 문제점과 HTTP 2.0의 해결 전략을 중심으로 알아보겠습니다. Multiplexed Streams HTTP 1.0에서 TCP 세션을 맺는 것을 중복해서 수행하는 성능 이슈가 있었고, HTTP 1.1에서 Keep-alive를 통해서 해당 문제를 풀어냈었습니다. https://jaehoney.tistory.com/279 HTTP 2.0에서는 Multiplexed라는 기술을 도입하는데 1개의 세션으로 여러 개의 요청을 순서 상관없이 ..

Operation/Network 2022.09.29

Network - Proxy와 Gateway의 차이!

프록시(Proxy)와 게이트웨이(Gateway)는 클라이언트와 목적지 서버 간의 중계하는 역할을 한다는 점에서 매우 유사하다. 프록시와 게이트웨이의 역할과 차이점에 대해서 알아보자. 프록시 프록시가 있는 서버에서는 아래와 같이 요청이 전달된다. 클라이언트 -> 프록시 프록시 -> 서버 프록시는 중간에서 요청을 받아서 전달하고, 응답도 받아서 클라이언트에 전달해야 하므로 커넥션을 적절히 다룰 수 있어야 한다. 프록시를 사용하는 목적은 아래와 같다. 네트워크 캐싱 보안점 역할 (방화벽) 나는 무중단 배포를 위해 Reverse Proxy(클라이언트 -> 프록시 서버 -> 내부 서버 구조의 Proxy)를 사용한 적이 있다. 참고: https://jojoldu.tistory.com/267 게이트웨이(Gateway..

Operation/Network 2022.09.29

Network - HTTP 1.0과 HTTP 1.1의 차이 (지속성, 파이프라이닝, ...)

HTTP(Hyper Text Transfer Protocol)는 인터넷에서 주로 사용하는 데이터를 송수신하기 위한 프로토콜이다. HTTP의 변환점 중 가장 큰 부분이 HTTP 1.0 -> HTTP 1.1과 HTTP 1.1 -> HTTP 2.0로의 발전이다. 해당 포스팅에서는 HTTP 1.0과 HTTP 1.1의 차이에 대해서 알아보자. 1. 지속성 HTTP 1.0과 HTTP 1.1의 가장 큰 차이점은 지속성이다. 그렇다. 바로 Connection: Keep-alive 속성이다. HTTP 1.0에서 요청하고 수신할 때마다 새로운 TCP 세션을 맺어야 한다. 반면, HTTP 1.1부터는 TCP 세션을 한 번만 맺으면 여러 개의 요청을 보내고 응답을 수신할 수 있다. 결과적으로 TCP 세션을 처리하는 비용을 줄..

Operation/Network 2022.09.29

Spring - Unique Key를 제어하는 방법 (비교) + Exception 처리!

JPA를 사용하면 아래와 같이 엔터티를 구현합니다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Account implements Serializable { @Id private String id; private String password; private String name; @Column(unique = true) private String phone; @Enumerated(value = EnumType.STRING) private AccountStatus status; @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "account_role", joinColumns..

Server/Spring 2022.09.28

Spring - 이미지 조회를 메모리 효율적으로 구현하기! (+ InputStreamResource)

기존에 Image를 조회하는 Controller Method가 있었다. 예시를 살펴보자. Byte[]를 반환 @GetMapping("/attachments/{no}") @ResponseStatus(HttpStatus.OK) public byte[] getImage(..., @PathVariable long no) { // ... 생략 return attachmentStorage.getImageContent(no); } 위와 같이 Controller method에서 byte[]로 이미지의 binary data를 반환해주면, 사용하는 쪽에서 와 같은 방식으로 이미지를 렌더링할 수 있다. 문제는 byte[]를 반환하기 위해서는 해당 파일을 앱서버에서 모두 읽어서 메모리에 보관한 이후에 클라이언트에 반환할 수 ..

Server/Spring 2022.09.27

백기선님 공개 코드 리뷰 받기! with 300명 22/09/17 (Package Structure, Test Code, DDD, ...)

최근에 백기선님이 유튜브에서 공개 코드 리뷰를 시작하셨다. 리뷰 내용을 보고 영감을 얻은 부분이 있었고, 부족한 부분을 알고 싶다는 생각에 용기를 내 신청했다! 코드 리뷰 영상은 아래 링크에서 확인할 수 있다. (백기선 유튜브 - 멤버십 회원 전용 영상) https://www.youtube.com/watch?v=w3QKOHSIZig 내가 리뷰 받을 코드는 초기 상태의 코드라서 설명이 부족해서 미리 양해를 구했다. 백기선님: 아 물론이죠! 아직 완성 안된 프로젝트도 리뷰 가능합니다! 그래서 신청했다. 리뷰 시작 리뷰를 할 때 실시간 접속자는 300분 정도 계셨다! 백기선님: 코드 리뷰를 어디로 중점적으로 보면 좋을까요?! 본인: 음 프로젝트 초기 단계라서 패키지 구조나 테스트 코드 위주로 봐주시면 감사하겠..

Etc./개발 일기 2022.09.26

Spring - Exception 처리 전략 적용기 (+ 에러 코드 문서화!)

최근 Exception에 대한 처리에 관심이 많아져서 관련 포스팅을 썼었다. REST에서 예외를 처리하는 다양한 방법! REST API에서 직접 정의한 Error code를 사용해야 하는 이유! 이번에 공부한 내용들과 추가로 참고 자료를 활용해서 사이드 프로젝트에서 예외 처리 전략을 풀어내보았고, 만족스러운 결과를 얻었다. 코드를 살펴보자. 코드 ErrorResponse 먼저 예외가 발생했을 때 Client 측에 내려줄 ErrorResponse를 정의한다. @Getter @AllArgsConstructor public class ErrorResponse { private final String code; private final String message; } ErrorCode 추가로 위와 같이 Erro..

Server/Spring 2022.09.19

JUnit - Enum으로 Test Fixture 사용하기! (feat. Object Mother, Test Data Builder)

테스트 데이터 생성 테스트 코드를 작성할 때 테스트 데이터는 어떻게 생성해야 할까..? 예시를 들어보자! 유저 조회, 게시글 생성, 댓글 등록 등 기능을 테스트할 때 모두 Member 생성이 필요하다. 각 테스트에서 일일이 생성자로 Member를 호출해도 되지만, 이를 재사용할 수 있다면 유지보수성이 좋은 코드가 된다. 잘 알려진 방법으로는 아래 2가지가 있다. 1. Test Data Builder 패턴 Test Data Builder 패턴은 Builder를 활용해서 테스트 데이터를 생성하는 패턴이다. public class UserStubGenerator { public static UserStub.Builder generateUserStub() { return UserStub.builder() .lo..

Server/JUnit, Spock 2022.09.16