전체 글 361

Spring - 다중 데이터 소스 환경에서 spring.sql.init이 동작하지 않는 이슈 해결

테스트 코드를 돌릴 때 docker-compose에 MySQL을 띄워서 로컬에서만 테스트하고 있었다. 해당 부분은 자동화할 필요가 있다고 느껴서 테스트 코드에 H2 및 테스트 자동화를 적용하기로 했다.테스트를 수행하기 전에 DDL 스크립트를 실행하도록 처리해야 했다.구현src/test/resources/application.yml에서 아래의 환경 설정을 적용했다.spring: jpa: hibernate: ddl-auto: none sql: init: schema-locations: classpath:sql/order-schema.sql mode: always해당 설정은 Hibernate에서 제공하는 DDL 자동 생성 기능을 사용하지 않고 직접 정의한 sql이 실행..

Server/Spring 2022.10.22

Network - OSI 7 Layer 제대로 이해하기! (심화)

OSI7 Layer는 어떠한 의미를 가질까..? 제대로 이해해보자. 7계층으로 왜 나눌까? 책임을 분산시킬 수 있다. 특정한 곳에 이상이 생기면 해당 단계만 수정할 수 있다. 통신이 일어나는 과정을 단계별로 알 수 있다. OSI 7 계층 전체 구성도 OSI 7 계층의 전체 구성은 아래와 같다. 많은 분들은 OSI 7 계층이 책임을 분산하는 것에만 목적이 있다고 알고 있다. 하지만 각 계층은 서로 독립적인 것이 아니다. 해당 구성을 보면 1 계층으로 갈 수록 전송하는 데이터가 많은 것을 알 수 있다. 그것이 어떠한 의미를 가지는 지 생각해보자. 각 단계의 역할 아래는 각 단계가 하는 역할을 그린 것이다. 해당 과정을 이해하기 위해 HTTP 요청을 예로 들어보자. 응용 계층 (application layer..

Operation/Network 2022.10.20

HTTP 메시지(message) 원문 분석해보기!

HTTP 원문이란? 아래와 같이 HTTP 메시지 전체를 의미한다. HTTP 메시지는 어떤 구조를 가지고 있는 지 알아보자. HTTP 메시지 구조 HTTP의 Message는 아래의 구조를 가진다. 1. 시작 라인 시작 라인(start-line)은 항상 HTTP Message의 첫 번째 줄에 위치한다. 시작 라인은 요청 메시지 / 응답 메시지 인지에 따라 아래의 정보를 포함한다. 요청 메시지 - HTTP Method, 요청 대상, HTTP Version (ex. GET /background.png HTTP1.1) 응답 메시지 - HTTP Version, HTTP Status Code, Http Status Text (ex. HTTP/1.1 404 Not Found.) 요청 메시지의 경우 추가로 아래의 형식으..

Operation/Network 2022.10.20

HTTP - Cache-Control 헤더 이해하기 (+ 웹캐시 적용하기!)

수신 확인 태그 API에 캐시를 적용하면서 공부한 것을 공유하겠습니다.이해를 위해 수신확인 태그를 먼저 설명드리겠습니다.메일 수신 확인 태그란 A가 B에게 메일을 보냈을 때 B가 메일을 확인 했는 지와 언제 확인했는 지 등을 확인할 수 있게 도와주는 기능입니다.메일을 보낼 때 발송 서버에서 수신 확인 태그를 형식으로 이미지 태그를 붙여서 발송해요해당 이미지 태그의 src는 수신 확인 태그의 end-point를 넣습니다.수신 확인 태그의 end-point는 DB에 해당 메일에 대해 읽음을 표시를 해주고 빈 이미지를 반환해줍니다.현재 MailArrival (수신 확인 요청)의 응답헤더는 아래와 같습니다. 캐시와 관련된 부분은 아래 2가지입니다.cache-control: 콘텐츠에 대한 캐싱 정책을 정의할 수..

Operation/Network 2022.10.12

Network - 대칭키, 공개키(비대칭키)란 무엇인가?!(+ SSL, HTTPS)

대칭키랑 공개키의 차이를 수도 없이 봤지만, 막상 설명해야 할 때 헷갈리는 경우가 많다. 대칭키의 장단점은 무엇이고, 어떠한 단점을 해결하기 위해 공개키가 등장하게 되었는지 등을 알아보자. 해당 포스팅에서 내용을 확실하게 정리하면서 다시는 헷갈리지 않도록 하자! 개요 대칭키 암호화 방식은 암복호화에 사용하는 키가 동일한 암호화 방식을 말한다. 공개키 암호화 방식은 암복호화에 사용하는 키가 서로 다른 암호화 방식을 말한다. (비대칭키 암호화라고도 한다.) 대칭키 대칭키는 암복호화키가 동일하므로 해당 키를 아는 사람이 문서를 복호화할 수 있게 된다. 대표적인 알고리즘은으로는 DES, 3DES, AES, SEED, ARIA 등이 있다. 공개키 암호화 방식에 비해 연산 속도가 빠르다는 장점이 있지만, 키를 교환..

Operation/Network 2022.10.12

Network - 주소 창에 www.naver.com을 치면 일어나는 일 (세분화!)

지난 포스팅에서는 DNS의 동작 원리와 과정만 다뤘습니다. https://jaehoney.tistory.com/74 이번 포스팅에서는 조금 더 상세히 세분화합니다. 세분화 주소 창에 www.naver.com을 치면 일어나는 일을 아래의 과정으로 세분화할 수 있습니다. 도메인 네임 조회 (Local) 라우팅 DNS에 도메인 정보를 질의 TCP 커넥션 HTTP 요청 컨텐츠 다운로드 브라우저 렌더링 1. 도메인 네임 조회 가장 먼저 하는 것은 해당 도메인에 대한 주소가 있는 지 검사하는 것입니다. DNS 서버에 질의하기 전에 브라우저의 DNS 캐시를 확인해서 www.naver.com에 대한 정보가 있는 지 확인합니다. 해당 캐시가 존재하지 않다면 로컬의 hosts 파일에 www.naver.com에 대한 정보가..

Operation/Network 2022.10.07

Spring Transaction - Propagation(전파 속성)

Transaction Propagation Spring Transaction의 Propagation(전파 범위)에 대해서 알아보자. 트랜잭션 전파 범위는 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법과 롤백되는 범위 등에 대한 속성값이다. 종류는 다음의 7가지가 있다. REQUIRED(default) REQUIRES_NEW MANDATORY SUPPORTS NESTED NEVER REQUIRED default 속성이다. Required는 부모 트랜잭션이 존재한다면 부모 트랜잭션에 합류한다. 그렇지 않다면 새로운 트랜잭션을 만든다. 중간에 자식 / 부모에서 예외가 발생한다면 자식과 부모 모두 rollback 한다. REQUIRES_NEW 무조건 새로운 트랜잭션을 만든다. nested한 방식으로 메소드..

Server/Spring JPA 2022.10.04

Spring - Request DTO에 NoArgsConstructor의 AccessLevel을 어떻게 설정할까?!

RequestDTO에 NoArgsConstructor(기본 생성자)가 반드시 필요하다. 이유는 @RequestBody를 사용할 때 Jackson2HttpMessageConverter를 사용하기 때문이다. 그러면 RequestDTO에 Lombok의 @NoArgsConstructor 애노테이션을 설정해주었다. @Getter @AllArgsConstructor @NoArgsConstructor public class CreateArtistRequest { @NotBlank private String name; } 이거면 충분할까? 그렇지 않다! Reflection Jackson2HttpMessageConverter는 기본 생성자를 통해 DTO의 인스턴스를 생성한다. 중요한 것은 이때 사용되는 것이 Reflec..

Server/Spring 2022.10.03

OS - 세마포어(Semaphore)와 뮤텍스(Mutex) (+ Race Condition)

공유 자원에 대해 여러 프로세스가 동시에 접근하면서, 결과값에 영향을 줄 수 있는 상태를 Race Condition(경쟁 상태)이라 한다. 공유 자원에 결함이 발생할 수 있음 Race Condition이 발생하는 경우와 해결 방법 커널 작업을 수행하는 중에 인터럽트 발생 문제점 : 커널모드에서 데이터를 로드하여 작업을 수행하다가 인터럽트가 발생하여 같은 데이터를 조작하는 경우 해결법 : 커널모드에서 작업을 수행하는 동안, 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하도록 한다. 프로세스가 'System Call'을 하여 커널 모드로 진입하여 작업을 수행하는 도중 문맥 교환이 발생할 때 문제점 : 프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 ..

Operation/OS 2022.10.03

OS - Process의 생성과 제어를 위한 System Calls!

Process의 생성과 제어를 위한 4가지 SystemCall에 대해 알아보자. Fork Wait Exec Exit Fork 새로운 Process를 생성한다. #include #include #include int main(int argc, char *argv[]) { printf("pid : %d", (int) getpid()); // pid : 29146 int rc = fork(); // 주목 if (rc < 0) { exit(1); } // (1) fork 실패 else if (rc == 0) { // (2) child 인 경우 (fork 값이 0) printf("child (pid : %d)", (int) getpid()); } else { // (3) parent case printf("par..

Operation/OS 2022.10.03