전체 글 132

[Network] 웹 통신의 큰 흐름

계층별 설명 응용 계층 (Application Layer) 사용자가 브라우저를 통해 "https://www.google.com/"을 입력하면, 1. 브라우저가 URL에 적힌 값을 파싱해서 HTTP Request Message를 만든 후, OS에 전송 요청 2. 브라우저는 DNS 서버에 "www.google.com"이라는 도메인 이름의 IP 주소를 요청(DNS Lookup) DNS Lookup 과정: 크롬의 경우 브라우저 → hosts파일 → DNS Cache의 순서로 도메인에 매칭되는 ip를 찾는다. (루트 도메인 서버 -> 서브도메인 서버순으로 찾음) 3. 브라우저는 IP 주소로 HTTPS 요청을 전송한다. 표현 계층 (Presentation Layer) 요청된 데이터를 표현하고 압축, 암호화 등의 변..

CS 2023.10.05

Java Sort Algorithm

Java에서 정렬을 수행하는 두 가지 주요 방법은 Arrays.sort()와 Collections.sort()이다. Arrays.sort()는 배열을 정렬할 때, Collections.sort()은 자료구조의 정렬 시 사용한다. 이 두개는 다른 정렬방식으로 구현된다. Arrays.sort() Arrays.sort의 코드는 듀얼피봇 퀵정렬(Dual-Pivot QuickSort)을 사용한다. 아래는 Arrays.sort의 주석과 코드이다. /** * Sorts the specified array into ascending numerical order. * * Implementation note: The sorting algorithm is a Dual-Pivot Quicksort * by Vladimir Y..

CS 2023.09.30

JPA delete 후 insert가 안될 때(duplicate entry error)

문제우선 user와 userImage가 OneToOne 관계를 가지고 있었다.user의 이미지 수정 요청 시, delete 후 insert 하기 위해 코드를 구현하는 와중에 duplicate entry error가 발생했다.unique 조건이 있는 데이터인데 삭제가 되지 않은 채로 추가를 하려 해서 발생하는 에러였다.로그를 확인해도 delete코드가 먼저 적혀있음에도 불구하고 insert를 먼저 실행하는 것을 확인할 수 있다.찾아보니 hibernate에서 동작하는 SQL 순서가 정해져 있었다. 시도 entityManager의 flush 메서드를 사용하여 손쉽게 영속성 컨텍스트의 변경내용(delete)을 DB에 동기화할 수 있었다.하지만 하나의 요청을 위해 entityManager를 호출하는 것은 비..

TroubleShooting 2023.09.03

[Springboot] QueryDSL을 활용한 물물교환 경매 시스템 개발기

프로젝트 배경물물교환 프로젝트를 진행하면서 경매 시스템을 추가하게 되었다.경매 시스템에서는 하한가 설정이 필수적인데, 팀원들과 많은 고민 끝에 등록된 물건의 가격을 랜덤한 유저들이 평가하게 하여 그 평균값을 하한가로 적용하는 방식을 선택하였다.이 과정에서 복잡한 쿼리가 필요했고, 처음으로 QueryDSL을 도입하게 되었다.QueryDSL이란?QueryDSL은 Java 기반의 타입 안전한 쿼리 작성을 위한 프레임워크이다.기존 JPQL이나 Native Query의 단점을 보완하여 다음과 같은 장점을 제공한다.QueryDSL의 주요 장점타입 안전성: 컴파일 타임에 쿼리 오류를 잡아낼 수 있다가독성: SQL과 유사한 문법으로 직관적인 쿼리 작성이 가능하다IDE 지원: 자동 완성과 리팩토링 기능을 완벽하게 지원한..

Springboot 2023.08.08

[TroubleShooting] InvalidDefinitionException

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.data.domain.PageImpl` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) Redis로 Page를 Caching 할 때 발생한 에러다. `org.springframework.data.domain.PageImpl` 클래스에 기본 생성자가 없어서 발생한다고 했다. 어떻게 해야할 지 고민하다가 PageImpl 클래스를 상속받..

TroubleShooting 2023.08.06

[Network] TCP/UDP

TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)는 네트워크에서 데이터를 전송하는 주요 프로토콜이다. TCP (Transmission Control Protocol) 데이터 단위: Segment 1 : 1 전송 통신을 시작하기 전에 세션을 설정하고, 데이터를 전송하고 받은 후 세션을 정리하는 방식으로 통신을 한다. 데이터 전송 중에 손실이나 오류가 발생하면 재전송을 요청하여 확실하게 데이터를 전달한다. 데이터를 보낸 순서대로 받아들이고 재조립하여 순서를 보장한다. 파일 전송, 웹 페이지 로딩 등 대용량 데이터 전송에 적합하며 주로 사용된다. 3-way handshake로 연결, 4-way handshake로 연결을 해제함으로써 신뢰성과 데이..

CS 2023.08.04

[TIL] S3이미지 업로드 시 게시글이 두번 작성되는 문제

프로젝트 진행 간 우리 조는 물물교환 사이트를 만들기로 했다. 게시글 등록 시 이미지를 등록할 수 있기에 S3에 이미지를 업로드 후 Repository에 등록을 하던 중에 발생한 문제였다. 분명 게시글 작성을 한번만 했는데 두개가 등록이 됐으며 하나는 이미지를 제외한 모든 값이 null이었고, 하나는 모든 값을 포함하지만 image를 가지지 못하였다. (Goods와 Image는 ManyToOne관계이다.) ServiceCode @Transactional public ApiResponse goodsCreate(GoodsRequestDto requestDto, List images) { List imageUuids = imageHelper.saveImagesToS3AndRepository(images, am..

TIL, WIL 2023.08.03

[CS] NoSQL vs RDMBS

NoSQL "Not Only SQL"의 약자로, RDBMS가 아닌 다른 형태의 데이터 저장과 처리를 지원하는 데이터베이스 시스템 장점: - 유연성이 높아서 비구조적인 데이터, 다양한 형태의 데이터를 처리하기 용이하다. - 대량의 데이터를 처리하는 데 뛰어난 성능을 가진다. - 수평적 확장이 쉽기 때문에 대규모 분산 시스템에 적합하다. - JSON과 같은 형태의 데이터 구조를 사용할 수 있다. 단점: - ACID (원자성, 일관성, 고립성, 지속성) 특성을 보장하지 않을 수 있어 데이터 무결성이 보장되지 않을 수 있다. - 복잡한 쿼리 작성이 어렵다. - 데이터 모델링에 유연성이 있기 때문에 비교적 데이터 일관성 유지가 어렵다. RDBMS "Relational Database Management Syste..

CS 2023.08.02

[CS] 쿠키와 세션의 차이

쿠키(Cookie) 클라이언트에 작은 데이터 조각을 저장하는 방식이다. 클라이언트에 저장되므로 클라이언트가 직접 수정할 수 있으며 보안에 비교적 취약하다. 주로 비밀번호, 로그인 상태 유지 등의 기능을 구현하는데 사용한다. 서버에서 일정 시간이 지나면 삭제되도록 설정한 암호화된 토큰으로 개인정보를 저장하여 사용한다. 각 도메인당 쿠키의 개수와 총 저장 용량에 제한이 있다. 세션(Session) 서버에 사용자 상태 정보를 저장하는 방식이다. 서버는 클라이언트 요청 시 고유한 세션 ID를 생성하고, 이를 쿠키를 통해 클라이언트에게 전송한다 로그인 정보, 장바구니 내역, 사용자 정보 등 사용자 상태를 유지하는데 사용한다. 쿠키와 달리 세션 데이터는 서버에 저장되므로 클라이언트가 직접 수정할 수 없고, 보안상 ..

CS 2023.08.01