일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- Locking Read
- foreach
- 동시성 문제
- iterator
- 자바
- db
- Lock
- 가비지 컬렉션
- 데이터 타입
- text
- 스프링
- iterable
- 가비지 컬렉터
- MySQL
- CAS
- Synchronized
- 동시성
- reflection
- Di
- 백엔드
- java
- MVCC
- gc
- Varchar
- jpa
- Atomic Type
- Today
- Total
목록전체 글 (89)
과정을 즐기자
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/baw7ML/btsuREZ7au0/flCOXlKjDdXdqEb1D5aWHK/img.png)
스프링 프레임워크를 이용해서 개발을 하다보면 DI라는 말을 자주 듣게 됩니다. 제어의 역전인 IoC는 제어의 권한을 제 3자에게 넘겼다는 말입니다. DI는 IoC의 일종으로 의존관계 주입을 개발자가 직접하는 것이 아니라 프레임워크에게 넘겼다는 말입니다. 이러한 사실을 알고 사용하고 있었지만 스프링이 어떻게 의존 관계 주입을 해주는 지 그 내부 동작 방식을 알아보고 싶었습니다. 또한 JPA를 사용하다보면 기본 생성자를 필수로 생성해야 한다는 것도 알고 있었지만 어떤 원리로 동작하는지는 정확히 알지 못했습니다. 이 2가지의 공통점이 있는데 바로 Java Reflection을 사용한다는 사실입니다. 이번 글에서는 Java Reflection에 대해 알아보고 지금까지 궁금증을 가지고 있었던 내부 동작 방식에 대..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OAU35/btst0vXKUTV/OktvcDCvmOfNPrRCSDcHjK/img.png)
프로그래밍 언어는 메모리 관리 주체에 따라 크게 2가지로 나눌 수 있습니다. 언어 자체적으로 메모리를 관리해주는 Managed 언어 (Java, C#)와 개발자가 직접 메모리를 관리하는 Unmanaged 언어 (C, C++)입니다. Managed 언어는 메모리에 할당된 객체를 개발자가 관리를 하지 않아도 되고 Garbage Collector가 대신해줍니다. 이번 글에서는 Garbage Collection에 대해 알아보겠습니다. JVM 메모리 구조 Garbage Collector가 메모리의 어떤 부분을 관리해주는 지 알아보기 위해 먼저 JVM의 메모리 구조에 대해 알아보겠습니다. JVM 메모리는 크게 5가지 영역으로 나뉩니다. 1. Method Area Method Area에는 자바 컴파일러에 의해 변환된..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/GxY7m/btsHSVvm7Ws/PklkGkWK61No1Wg76BKvq1/img.png)
이번 글은 MySQL과 InnoDB 스토리지 엔진을 기준으로 작성하였습니다. MySQL에는 여러 데이터 타입이 있습니다. 숫자형 데이터 타입, 문자열 데이터 타입, 날짜 시간 데이터 타입 등..이 중에서 문자열 데이터 타입의 종류에는 CHAR, VARCHAR, TEXT 등이 있습니다.CHAR는 고정 크기 문자열 방식이고 VARCHAR는 가변 크기 문자열 방식이고 TEXT는 긴 문자열을 저장할 때 사용합니다. 이때 한가지 의문이 듭니다. VARCHAR가 가변 크기 문자열 방식이라면 TEXT를 사용하지 않고 그냥 최대 크기인 VARCHAR(16683)로 (65535 bytes) 선언하면 되지 않을까요? 어차피 10글자만 입력하면 실질적인 10글자인 40bytes를 저장하고 나머지 4byte는 길이정보로 사용..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VyazG/btssIn8tSod/zv4uqTN6KjA1xXTSGlJngK/img.png)
이번 글에서는 서버가 처리할 수 있는 요청의 수는 어떻게 결정되는지 알아보겠습니다.그 전에 먼저 전체적인 웹 서비스의 흐름을 간단하게 살펴보겠습니다. 우선 크게 3가지 서버로 나눌 수 있습니다. 웹 서버, WAS, DB입니다.웹 서버는 Nginx, Apache 등이 있고 정적인 컨텐츠를 처리, 보안, 로드 밸런서 등의 역할을 합니다.WAS는 Tomcat, Jetty 등이 있고 애플리케이션 로직같은 동적 컨텐츠를 처리합니다.DB는 MySQL, Oracle, MongoDB 등이 있고 데이터를 저장하는 역할을 합니다. 사용자의 요청이 오면 웹 서버, WAS, DB를 거쳐 응답을 반환합니다.물론 이때 DB를 거치지 않고 웹 서버나, WAS에서 바로 응답을 반환할 수도 있습니다. 스프링부트를 사용하면 톰캣 서버..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b0l0vP/btssfxKBvbH/xlo5foDaSYW3NcaFu2JzO0/img.png)
현재 가장 많이 사용되는 백엔드 기술 스택으로 Spring과 Node.js가 있습니다. Spring은 Java, kotlin과 같은 JVM 계열의 언어를 사용하고 사용하는 언어에 따라 Java Spring, kotlin Spring이라고 부릅니다. Node.js는 기본적으로 javascript을 사용하지만 타입이 없다는 단점이 있어 현재는 TypeScript를 주로 사용합니다. 이번 글에서는 2가지 기술 스택을 비교해보며 각각 어떤 장단점이 있으며 어떠한 경우에 사용하면 좋을 지 알아보겠습니다. 동작방식 기본적으로 Spring은 멀티 쓰레드 동기 방식으로 작동합니다. 아래 그림과 함께 더 자세히 알아보겠습니다. 예를들어 동시에 10개의 사용자 요청이 왔다고 하면 쓰레드 풀에서 10개의 쓰레드를 꺼내어 각..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uv3e0/btsrtcU3EEu/pYp7EU0CKIcdKKf6qkGHt1/img.png)
이전 글에서 자바 쓰레드 관리의 시작에 대해 알아보았습니다. 자바 쓰레드 관리의 시작 OS 쓰레드와 유저 쓰레드 자바 쓰레드 관리에 대해 알아보기 전에 OS 쓰레드와 유저 쓰레드에 대해 먼저 알아보겠습니다. OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드로 CPU 에서 실제 320hwany.tistory.com 자바는 멀티 쓰레드를 이용해 동시성 프로그래밍을 가능하게 했습니다. 하지만 Thread, Runnable은 매번 쓰레드의 생성과 종료를 직접해야 하며 쓰레드 관리가 어려웠습니다. 또한 쓰레드를 실행만 할 수 있을 뿐 결과 값을 반환할 수는 없었습니다. Callable, Future의 등장 자바가 발전하면서 Callable, Future가 등장했습니다. @FunctionalInterfac..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c1XJaG/btsrteEIHgU/LVkE12jaEcIiQ0OgdHTnjK/img.png)
OS 쓰레드와 유저 쓰레드자바 쓰레드 관리에 대해 알아보기 전에 OS 쓰레드와 유저 쓰레드에 대해 먼저 알아보겠습니다.OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드로 CPU 에서 실제로 실행되는 단위로 CPU 스케줄링의 단위입니다.OS 쓰레드의 컨텍스트 스위칭은 커널이 개입하고 비용이 발생하게 됩니다.유저 쓰레드는 OS 커널이 아닌 User Program과 관련되어 있는 쓰레드로 쓰레드 개념을 프로그래밍 레벨에서 추상화한 것입니다.이때 유저 쓰레드가 CPU에서 실행되려면 OS 쓰레드와 반드시 연결되어야 합니다. 유저 쓰레드와 OS 쓰레드를 연결하는 모델로는 One-to-One, Many-to-One, Many-to-Many 모델이 있습니다.자바의 초창기는 Many-to-One 모델이었습니다...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/syYIc/btsqM7TyOlx/IkxlKuASmUwKQ0akucLlT1/img.png)
이번 글에서는 저번 글에 이어서 애플리케이션 계층(L7)이 하는 일에 대해 알아보겠습니다. 물리 계층(L1), 데이터 링크 계층(L2), 네트워크 계층(L3), 트랜스포트 계층(L4)이 하는 일은 이전 글들을 참고해주세요 L7 - 애플리케이션 계층 L7은 개발자가 직접 다루는 애플리케이션이 하는 일에만 집중합니다. 하위 계층에서 어떤 프로토콜이 어떻게 동작할 지 모르더라도 개발자는 L7 계층의 프로토콜을 이용하여 애플리케이션을 만들 수 있습니다. L7의 프로토콜로는 DHCP, DNS, SSH, FTP, STMP, IMAP, HTTP 등이 있습니다. 지금부터 이러한 프로토콜에 대해서 알아보겠습니다. DHCP 우리가 사용하는 컴퓨터는 연결된 라우터와 같은 네트워크에서 겹치지 않는 IP 주소를 할당받아야 합니..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wijvv/btsqh3pTicH/ANvBq8zBsShhqf1lJECsp0/img.png)
이번 글에서는 Stateless인 HTTP에서 로그인을 어떻게 유지하는 지에 대해서 생각해보며 성능을 고려하여 세션 기반 인증, 토큰 기반 인증을 비교해보겠습니다. 세션 기반 인증 세션을 저장하는 곳 세션 기반 인증은 서버측에서 사용자들의 정보를 기억해야 합니다. 사용자가 로그인 요청을 하면 서버에서는 로그인 할 수 있는 회원인지 확인한 후 로그인 가능하면 Set-Cookie에 Session Id를 반환합니다. 그러면 사용자의 다음 요청시 쿠키의 헤더를 보고 서버는 사용자가 로그인 유지를 할 수 있도록 합니다. 하지만 이때 문제점이 있습니다. 사용자의 세션 정보는 서버가 가지고 있는데 트래픽이 늘어나 서버가 여러 대로 늘어난다면 사용자는 로그인을 요청했던 서버에게 요청을 할 때만 로그인을 유지할 수 있다..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cxzwcD/btsqaOM6O0P/6nSoeyEqv73lUaTkP7EZj1/img.png)
프로그래밍 언어를 공부하다보면 Call By Value, Call By Reference 라는 용어가 자주 들립니다. Call By Value는 값을 전달하는 방식이고 Call By Reference는 주소를 전달하는 방식입니다. 그렇다면 자바는 어떤 방식을 사용할까요? 변수를 Primitive type, Reference type으로 나눠 각각 테스트 해보겠습니다. Primitive type @Test @DisplayName("정수를 매개변수로 받아서 Call By Value로 동작하는 지 확인한다") void test1() { // given int a = 10; - 1 int b = 20; - 2 // when inner1(a, b); // then assertThat(a).isEqualTo(10)..