분류 전체보기
-
본 포스팅은 kotlin과 java 코드가 혼재되어 있으며 spring boot 3.x 버전에서 사용된 코드입니다. RestTemplate이란? Spring MVC에서는 외부 요청을 위해 RestTemplate을 사용합니다. spring boot 3.x 설정 RestTemplate은 커넥션 풀을 지원하지 않아 구성 요소인 HttpClient를 통해서 커넥션과 관련된 추가 세팅을 진행합니다. 아래 RestTemplateGenerator 클래스는 restTemplate을 만들어내서 반환해 주는 object 클래스로 spring boot 3.x 버전부터 사용하는 RestTemplate 설정입니다. object RestTemplateGenerator { // https://www.baeldung.com/http..
Spring - restTemplate 대용량 파일 업로드, 다운로드 설정본 포스팅은 kotlin과 java 코드가 혼재되어 있으며 spring boot 3.x 버전에서 사용된 코드입니다. RestTemplate이란? Spring MVC에서는 외부 요청을 위해 RestTemplate을 사용합니다. spring boot 3.x 설정 RestTemplate은 커넥션 풀을 지원하지 않아 구성 요소인 HttpClient를 통해서 커넥션과 관련된 추가 세팅을 진행합니다. 아래 RestTemplateGenerator 클래스는 restTemplate을 만들어내서 반환해 주는 object 클래스로 spring boot 3.x 버전부터 사용하는 RestTemplate 설정입니다. object RestTemplateGenerator { // https://www.baeldung.com/http..
2023.12.31 -
AttributeConverter AttributeConverter는 주로 다음과 같은 상황에서 사용됩니다. JPA가 지원하지 않는 타입을 매핑 두 개 이상의 속성을 갖는 밸류 타입을 한 개 칼럼에 매핑 JPA가 지원하지 않는 타입을 매핑 public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData); } X : 엔티티의 속성에 대응하는 타입 Y : DB에 대응하는 타입 convertToDatabaseColumn 엔티티의 X 타입 속성을 Y 타입의 DB 데이터로 변환합니다. 엔티티 속성을 DB에 반영할 때 사용됩니다. convertTo..
JPA - AttributeConverterAttributeConverter AttributeConverter는 주로 다음과 같은 상황에서 사용됩니다. JPA가 지원하지 않는 타입을 매핑 두 개 이상의 속성을 갖는 밸류 타입을 한 개 칼럼에 매핑 JPA가 지원하지 않는 타입을 매핑 public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData); } X : 엔티티의 속성에 대응하는 타입 Y : DB에 대응하는 타입 convertToDatabaseColumn 엔티티의 X 타입 속성을 Y 타입의 DB 데이터로 변환합니다. 엔티티 속성을 DB에 반영할 때 사용됩니다. convertTo..
2023.12.31 -
application/octet-stream은 무엇일까? 구글링 결과는 다음과 같습니다. application/octet-stream은 이 타입은 이진 파일을 위한 기본값입니다. 이 타입은 실제로 잘 알려지지 않은 이진 파일을 의미하므로, 브라우저는 보통 자동으로 실행하지 않거나 실행해야 할지 묻기도 합니다. Content-Disposition 헤더가 값 attachment 와 함게 설정되었고 'Save As' 파일을 제안하는지 여부에 따라 브라우저가 그것을 다루게 됩니다. application/octet-stream은 알려지지 않은 이진 파일을 알리는 content-type이라고 볼 수 있습니다. multipart/form-data 클라이언트는 HTTP Request의 Body에 전송하고자 하는 데이터..
Tomcat의 file upload (feat. octet-stream, multipart)application/octet-stream은 무엇일까? 구글링 결과는 다음과 같습니다. application/octet-stream은 이 타입은 이진 파일을 위한 기본값입니다. 이 타입은 실제로 잘 알려지지 않은 이진 파일을 의미하므로, 브라우저는 보통 자동으로 실행하지 않거나 실행해야 할지 묻기도 합니다. Content-Disposition 헤더가 값 attachment 와 함게 설정되었고 'Save As' 파일을 제안하는지 여부에 따라 브라우저가 그것을 다루게 됩니다. application/octet-stream은 알려지지 않은 이진 파일을 알리는 content-type이라고 볼 수 있습니다. multipart/form-data 클라이언트는 HTTP Request의 Body에 전송하고자 하는 데이터..
2023.12.31 -
메모리 구조 모든 프로그램은 메모리에 올라와야 실행할 수 있습니다. 따라서 프로그램에 사용되는 변수들을 저장할 메모리가 필요한데 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공합니다. 대표적으로 위와 같은 4가지 영역이 있습니다. Code 영역 실행한 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 합니다. CPU는 코드 영역에서 저장된 명령어를 하나씩 가져가서 처리합니다. Data 영역 전역 변수, 정적 변수가 저장되는 영역입니다. 프로그램의 시작과 함께 할당되어 프로그램이 종료되면 소멸합니다. Heap 영역 프로그램을 실행하면서 생성한 모든 객체가 저장되는 영역입니다.(흔히 new를 통해 성상한 모든 Object 타입의 인스턴스가 저장되는 영역) 힙 영역에 보관되는 메모리는 메소드..
가비지 컬렉터메모리 구조 모든 프로그램은 메모리에 올라와야 실행할 수 있습니다. 따라서 프로그램에 사용되는 변수들을 저장할 메모리가 필요한데 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공합니다. 대표적으로 위와 같은 4가지 영역이 있습니다. Code 영역 실행한 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 합니다. CPU는 코드 영역에서 저장된 명령어를 하나씩 가져가서 처리합니다. Data 영역 전역 변수, 정적 변수가 저장되는 영역입니다. 프로그램의 시작과 함께 할당되어 프로그램이 종료되면 소멸합니다. Heap 영역 프로그램을 실행하면서 생성한 모든 객체가 저장되는 영역입니다.(흔히 new를 통해 성상한 모든 Object 타입의 인스턴스가 저장되는 영역) 힙 영역에 보관되는 메모리는 메소드..
2023.12.30 -
HTTP와 HTTPS HTTP Hypertext Transfer Protocol의 줄임말 서로 다른 시스템들 사이에서 통신을 주고받게 하는 가장 기본적인 프로토콜입니다. 서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용합니다. HTTPS Hypertext Transfer Protocol Secure의 줄임말 SSL(보안 소켓 계층)을 사용 SSL은 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와주고, 서버와 브라우저가 민감한 정보를 주고받을 때 해당 정보가 도난당하는 것을 막아줍니다. Header는 암호화하지 않고 HTTP Message Body만 암호화합니다. SSL/TLS SSL/TLS는 HTTPS에서 암호화 시 사용하는 방식입니다. SSL의 업그레이드 버전이 TLS로,..
HTTP/HTTPSHTTP와 HTTPS HTTP Hypertext Transfer Protocol의 줄임말 서로 다른 시스템들 사이에서 통신을 주고받게 하는 가장 기본적인 프로토콜입니다. 서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용합니다. HTTPS Hypertext Transfer Protocol Secure의 줄임말 SSL(보안 소켓 계층)을 사용 SSL은 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와주고, 서버와 브라우저가 민감한 정보를 주고받을 때 해당 정보가 도난당하는 것을 막아줍니다. Header는 암호화하지 않고 HTTP Message Body만 암호화합니다. SSL/TLS SSL/TLS는 HTTPS에서 암호화 시 사용하는 방식입니다. SSL의 업그레이드 버전이 TLS로,..
2023.12.30 -
Index란? 인덱스란 (검색을 위해) 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것 입니다. 인덱스를 사용하게 되면 데이터 추가, 수정, 삭제의 성능을 희생하고 대신 조회의 성능을 향상 시킵니다. 여기서 주의할 것은 update, delete 행위가 느린것이지 update, delete를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회 됩니다. Clustered Index vs Non-Clustered Index 인덱스 종류에는 clustered와 Non-Clustered 두 가지가 있습니다. MySQL의 InnoDB엔진에서는 인덱스가 B-Tree(균형 트리) 자료구조로 구성되어 있습니다. Cluster Index(클러스터형 인덱스) 한 테이블당 1개 (Prima..
MySQL 인덱스Index란? 인덱스란 (검색을 위해) 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것 입니다. 인덱스를 사용하게 되면 데이터 추가, 수정, 삭제의 성능을 희생하고 대신 조회의 성능을 향상 시킵니다. 여기서 주의할 것은 update, delete 행위가 느린것이지 update, delete를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회 됩니다. Clustered Index vs Non-Clustered Index 인덱스 종류에는 clustered와 Non-Clustered 두 가지가 있습니다. MySQL의 InnoDB엔진에서는 인덱스가 B-Tree(균형 트리) 자료구조로 구성되어 있습니다. Cluster Index(클러스터형 인덱스) 한 테이블당 1개 (Prima..
2023.12.30 -
MySQL 아키턱처 MySQL 접속 클라이언트 대부분의 프로그래밍 언어에 대한 접속 API 제공 쉘 스크립트를 통해 접속 가능 MySQL 엔진 클라이언트 접속과 SQL 요청 처리 담당 쿼리 파서, 전처리기, 옵티마이저(요청된 SQL문을 최적화해서 실행하기 위한 실행계획을 짜는 역할), 실행 엔진 등으로 구성 MySQL 스토리지 엔진 데이터를 실제로 디스크에 저장하거나 읽어오는 역할 옵티마이저가 작성한 실행 계획에 따라서 적절히 실행 MySQL 엔진이 스토리 엔진을 호출할 때 사용하는 API를 핸들러 API라고 함 운영체제, 하드웨어 실제 테이블 데이터와 로그 데이터를 파일로 저장하는 부분 쿼리 실행 과정 사용자가 SQL 요청을 MySQL로 보냅니다. 가장 먼저 쿼리 캐시를 만나는데 쿼리 캐시는 쿼리 요청..
MySQL 아키텍처MySQL 아키턱처 MySQL 접속 클라이언트 대부분의 프로그래밍 언어에 대한 접속 API 제공 쉘 스크립트를 통해 접속 가능 MySQL 엔진 클라이언트 접속과 SQL 요청 처리 담당 쿼리 파서, 전처리기, 옵티마이저(요청된 SQL문을 최적화해서 실행하기 위한 실행계획을 짜는 역할), 실행 엔진 등으로 구성 MySQL 스토리지 엔진 데이터를 실제로 디스크에 저장하거나 읽어오는 역할 옵티마이저가 작성한 실행 계획에 따라서 적절히 실행 MySQL 엔진이 스토리 엔진을 호출할 때 사용하는 API를 핸들러 API라고 함 운영체제, 하드웨어 실제 테이블 데이터와 로그 데이터를 파일로 저장하는 부분 쿼리 실행 과정 사용자가 SQL 요청을 MySQL로 보냅니다. 가장 먼저 쿼리 캐시를 만나는데 쿼리 캐시는 쿼리 요청..
2023.12.30 -
Blocking vs Non-Blocking 두 가지의 차이점은 다른 주체가 작업할 때 자신이 코드를 실행할 제어권이 있는지 없는지로 판단할 수 있습니다. Blocking Blocking 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 제어권을 다른 주체로 넘깁니다. 따라서 자신은 제어권이 없기 때문에 실행할 수 없고, 다른 주체가 실행을 완료하고 제어권을 돌려줄 때까지 아무 작업도 할 수 없습니다. Non-Blocking Non-Blocking은 다른 주체의 작업에 관련 없이 자신이 제어권을 갖고 있습니다. 따라서, 자신은 계속 작업을 수행할 수 있습니다. Sync vs Async 두 가지의 차이점은 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지 에 차이가 있습니다. 아래 설명부터 A는..
Blocking과 Non-Blocking, Sync와 AsyncBlocking vs Non-Blocking 두 가지의 차이점은 다른 주체가 작업할 때 자신이 코드를 실행할 제어권이 있는지 없는지로 판단할 수 있습니다. Blocking Blocking 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 제어권을 다른 주체로 넘깁니다. 따라서 자신은 제어권이 없기 때문에 실행할 수 없고, 다른 주체가 실행을 완료하고 제어권을 돌려줄 때까지 아무 작업도 할 수 없습니다. Non-Blocking Non-Blocking은 다른 주체의 작업에 관련 없이 자신이 제어권을 갖고 있습니다. 따라서, 자신은 계속 작업을 수행할 수 있습니다. Sync vs Async 두 가지의 차이점은 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지 에 차이가 있습니다. 아래 설명부터 A는..
2023.12.30 -
메모리가 관리되는 방법 메모리는 주소 덩어리로, 주소로 인덱싱하는 커다란 배열입니다. 컴퓨터가 부팅되면 텅텅 비어있던 메모리에 운영체제나 사용자 프로그램이 배열의 원소처럼 채워지면서 CPU를 점유할 기회를 노립니다. CPU가 메모리에 채워진 프로그램 속 코드를 곧장 읽으면 좋겠지만 CPU를 코드를 읽지 못합니다. 숫자로 바꿔줘야 합니다. 소스 코드를 숫자로 바꿔주는 것이 컴파일러고, 컴파일러가 동작하는 과정에서 코드들의 논리 주소를 결정합니다. 각각 프로그램마다 다른 논리 주소를 갖는 것이 아니라, 중복되는 논리 주소를 갖고 있습니다. 그래서 논리 주소를 가상 주소라고도 부릅니다. 모두 같은 주소를 사용한다면 메모리에서 어떻게 이를 구분할까요? 논리 주소 앞에 하나의 주소값이 더 추가되면서 프로그램마다 ..
리눅스 메모리 관리메모리가 관리되는 방법 메모리는 주소 덩어리로, 주소로 인덱싱하는 커다란 배열입니다. 컴퓨터가 부팅되면 텅텅 비어있던 메모리에 운영체제나 사용자 프로그램이 배열의 원소처럼 채워지면서 CPU를 점유할 기회를 노립니다. CPU가 메모리에 채워진 프로그램 속 코드를 곧장 읽으면 좋겠지만 CPU를 코드를 읽지 못합니다. 숫자로 바꿔줘야 합니다. 소스 코드를 숫자로 바꿔주는 것이 컴파일러고, 컴파일러가 동작하는 과정에서 코드들의 논리 주소를 결정합니다. 각각 프로그램마다 다른 논리 주소를 갖는 것이 아니라, 중복되는 논리 주소를 갖고 있습니다. 그래서 논리 주소를 가상 주소라고도 부릅니다. 모두 같은 주소를 사용한다면 메모리에서 어떻게 이를 구분할까요? 논리 주소 앞에 하나의 주소값이 더 추가되면서 프로그램마다 ..
2023.12.30 -
프로그램과 프로세스 피자와 피자 레시피를 비유로 들면 이와 같습니다. 피자 레시피 = 코드가 구현되있는 파일 = 프로그램 피자 레시피가 피자가 되는 것처럼 코드 파일(프로그램)도 실행되어 사용할 수 있는 무언가!!가 되어야 합니다. 그 무언가가 프로세스 입니다. 프로그램 -> 프로세스 프로그램이 프로세스가 되면서 총 2가지 일이 발생합니다. 프로세스가 필요로 하는 재료들이 메모리에 올라가야 합니다. 메모리는 Code, Data, Heap, Stack 으로 총 4가지 영역으로 구성되어 있습니다. 또한, 해당 프로세스에 대한 정보를 담고 있는 Process Control Block(PCB)가 프로세스 생성 시 함께 만들어 집니다. Process & Thread 우리는 대부분 위 그림과 같이 여러 가지의 프로..
Process & Thread프로그램과 프로세스 피자와 피자 레시피를 비유로 들면 이와 같습니다. 피자 레시피 = 코드가 구현되있는 파일 = 프로그램 피자 레시피가 피자가 되는 것처럼 코드 파일(프로그램)도 실행되어 사용할 수 있는 무언가!!가 되어야 합니다. 그 무언가가 프로세스 입니다. 프로그램 -> 프로세스 프로그램이 프로세스가 되면서 총 2가지 일이 발생합니다. 프로세스가 필요로 하는 재료들이 메모리에 올라가야 합니다. 메모리는 Code, Data, Heap, Stack 으로 총 4가지 영역으로 구성되어 있습니다. 또한, 해당 프로세스에 대한 정보를 담고 있는 Process Control Block(PCB)가 프로세스 생성 시 함께 만들어 집니다. Process & Thread 우리는 대부분 위 그림과 같이 여러 가지의 프로..
2023.12.30 -
설정하기 build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "3.0.4" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.7.22" kotlin("plugin.spring") version "1.7.22" kotlin("plugin.jpa") version "1.7.22" kotlin("kapt") version "1.7.22" } group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompat..
Spring Data JPA - QueryDSL 사용하기설정하기 build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "3.0.4" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.7.22" kotlin("plugin.spring") version "1.7.22" kotlin("plugin.jpa") version "1.7.22" kotlin("kapt") version "1.7.22" } group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompat..
2023.12.30 -
@Transactional(readOnly = true) service layer에서 @Transactional을 대부분 사용합니다. 데이터 변경이 있는 경우 @Transactional을 붙이고 데이터 조회만 하는 경우라면 @Transactional(readOnly = true)를 명시합니다. readOnly가 true로 붙은 조회용의 경우 스냅샷이 생기지 않습니다. 즉, 영속성 컨텍스트에서 관리는 하고 있지만 dirty checking을 안하기 때문에 수정해도 DB에 결과가 반영되지 않습니다. N+1 N+1 은 엔티티를 조회할 때, 해당 엔티티에 연관관계를 갖는 다른 엔티티를 프록시로 가져오면서(LazyLoading) 실제 데이터에 접근하는 시점에 해당 엔티티를 가져오기 위해 또 다른 조회 쿼리를 보내..
Spring Data JPA - 성능 최적화@Transactional(readOnly = true) service layer에서 @Transactional을 대부분 사용합니다. 데이터 변경이 있는 경우 @Transactional을 붙이고 데이터 조회만 하는 경우라면 @Transactional(readOnly = true)를 명시합니다. readOnly가 true로 붙은 조회용의 경우 스냅샷이 생기지 않습니다. 즉, 영속성 컨텍스트에서 관리는 하고 있지만 dirty checking을 안하기 때문에 수정해도 DB에 결과가 반영되지 않습니다. N+1 N+1 은 엔티티를 조회할 때, 해당 엔티티에 연관관계를 갖는 다른 엔티티를 프록시로 가져오면서(LazyLoading) 실제 데이터에 접근하는 시점에 해당 엔티티를 가져오기 위해 또 다른 조회 쿼리를 보내..
2023.12.30