일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백엔드
- Synchronized
- Varchar
- 데이터 타입
- db
- reflection
- Locking Read
- gc
- Lock
- MVCC
- iterator
- 가비지 컬렉터
- 가비지 컬렉션
- MySQL
- 스프링
- 자바
- java
- 동시성
- CAS
- 동시성 문제
- foreach
- jpa
- Di
- text
- Atomic Type
- iterable
- Today
- Total
목록전체 글 (89)
과정을 즐기자
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/RZxXH/btsBDPnd9uO/AczxW79vKnu2knSFKJ4Od0/img.png)
Spring은 기본적으로 멀티 쓰레드, 동기 방식으로 작동합니다. 하지만 성능 향상을 위해서 비동기 방식으로 작동을 하도록 할 수 있습니다. 이번 글에서는 싱글 쓰레드/멀티 쓰레드, 동기/비동기에 대한 설명과 함께 Spring에서 멀티 쓰레드 비동기 프로그래밍을 해보겠습니다. Java의 쓰레드 모델 먼저 자바의 쓰레드에 대해 알아보겠습니다. 쓰레드의 종류에는 여러가지가 있지만 주요 쓰레드로는 OS 쓰레드, 유저 쓰레드가 있습니다. OS 쓰레드는 OS 커널 레벨에서 생성되고 관리되는 쓰레드입니다. 즉, CPU에서 실제로 실행되는 단위를 말하며 CPU의 스케줄링의 단위가 됩니다. 사용자의 코드, 커널 코드 모두 OS 쓰레드에서 실행된다고 볼 수 있습니다. 유저 쓰레드는 쓰레드의 개념을 프로그래밍 레벨에서 추..
자바 빈 규약이란 자바에서 재사용 가능한 소프트웨어 컴포넌트를 만들기 위해 정한 규칙을 말합니다. 다음과 같은 자바 빈 규약이 있습니다. 1. 기본 생성자를 반드시 가져야 한다 2. 빈이 패키지화 되어 있어야 한다 3. 멤버 변수의 접근자는 private으로 선언한다 4. 멤버 변수에 접근하기 위한 public 접근자인 getter/setter 메소드가 존재해야 한다 여기서 자바 빈 규약의 4번 예시처럼 getter/setter를 사용하여 외부에서 데이터를 가져오고 변경할 수 있습니다. 하지만 setter의 경우 외부에서 객체의 필드를 마음대로 바꿀 수 있으며 setter라는 메소드가 어떠한 이유로 필드의 값을 변경했는 지를 파악하기 어렵습니다. 따라서 필드의 값을 변경해야 한다면 의미있는 메소드명을 사..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cbWZZe/btsAyTK29En/F7H34sDjW4pkKmc3wGKboK/img.png)
HTTP는 인터넷 상에서 가장 많이 사용되고 있는 애플리케이션 프로토콜입니다. HTTP는 웹에서 데이터를 주고 받는 프로토콜로 클라이언트-서버 구조입니다. HTTP를 사용하여 HTML 문서, 이미지, 동영상을 주고 받을 수 있습니다. HTTP 헤더에는 메세지의 속성 정보, 상태 정보가 있고 HTTP 바디에는 실제로 전송하려는 데이터가 들어갑니다. 이러한 HTTP는 1991년부터 시작하여 지속적으로 발전해왔습니다. 이번 글에서는 HTTP의 버전별 특징에 대해 알아보겠습니다. HTTP/0.9 처음부터 존재하던 버전은 아니었고 초기 버전으로 구분하기 위해 이후에 붙여진 버전입니다. 요청은 단일 라인으로 구성되며 리소스에 대한 메소드는 GET만 존재합니다. HTTP 헤더도 없고 HTML 파일만 전송 가능했던 버..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cG8BQv/btsz1r9kpc1/9QalNkiywiKfU8ffH8VkXk/img.png)
개발을 하다보면 직렬화라는 단어를 종종 듣게됩니다. JSON, XML, 프로토콜 버퍼, Java Serialization... 등등 그렇다면 이러한 직렬화는 정확히 무엇이고 왜 사용하는 것일까요? 이번 글에서는 직렬화에 대해 알아보겠습니다. 직렬화란? 직렬화는 현재 데이터 구조나 오브젝트 상태를 영속적으로 저장하거나 다른 환경으로 전달하기 위해 어떠한 정해진 포맷으로 변환하는 과정입니다. 반대로 역직렬화는 직렬화된 포맷을 원래의 데이터 구조나 오브젝트 상태로 복구하는 과정입니다. 그렇다면 이러한 직렬화는 왜 필요한 것일까요? 이를 알아보기 전에 먼저 스택, 힙과 관련된 메모리에 대한 이해가 필요합니다. 스택, 힙 자바를 예시로 들겠습니다. 정수형의 데이터 a, b가 있을 때 이 값들은 모두 스택에 저장되..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TOBRe/btszhvmdMdc/T0ZjtCpJuuXSxzKT5FPSrK/img.png)
바이너리 데이터는 컴퓨터가 이해하기 쉬운 형식의 데이터로 일련의 0과 1로 표현됩니다. 이러한 바이너리 데이터는 텍스트 데이터에 비해 효율적으로 저장되며 데이터를 더 빠르게 전송할 수 있습니다. 기계가 읽을 수 있는 언어이기 때문에 빠른 처리가 가능하고 오류가 발생할 가능성이 적어집니다. 이러한 바이너리 데이터로는 이미지(JPEG), 오디오(MP3), 동영상(MP4) 등이 있습니다. 이번 글에서는 이러한 바이너리 데이터를 처리하는 방법에 대해 작성해보려고 합니다. 인코딩 방식 바이너리 데이터를 처리하는 방법 중 하나로 Base64를 사용하는 인코딩 방식이 있습니다. Base64는 바이너리 데이터를 아스키 코드 일부와 일대일로 매칭되는 문자열로 단순 치환하는 인코딩 방식입니다. 즉, Base64를 사용하여..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dCcoI8/btsyIM8XljA/2v6OMMpXU19IS22TpJrjEk/img.png)
Spring 프레임워크를 이용해 개발하다보면 여러 장점이 있습니다. DI/IoC 컨테이너, 테스트 용이, 그리고 스프링부트를 사용한다면 내장 톰캣, 버전 설정, 자동 구성.. 등 여러 장점이 있습니다. Spring은 객체지향 프로그래밍을 더 잘할 수 있도록 도와줍니다. 각각의 역할과 책임을 분리하도록 개발을 유도하기 때문입니다. 이때 가장 먼저 접하는 아키텍쳐는 Layerd Architecture로 크게 3가지로 나눈다면 클라이언트 요청을 받고 응답을 해주는 Presentation Layer, 비즈니스 로직을 처리하는 Application Layer, 데이터베이스에 접근하는 Data Access Layer로 나눌 수 있습니다. 저도 이러한 구조로 계속 개발을 해왔지만 기능이 많아지고 복잡해질 수록 문제점..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bqmLtg/btsxSCe9OJk/Q5sw7PBSrKKmaxSqqUHXJk/img.png)
자바는 멀티 쓰레드 기반의 동시성 프로그래밍을 지원합니다. 따라서 CPU 코어가 많아질 수록 이를 잘 활용할 수 있습니다. 하지만 멀티 쓰레드이기 때문에 반드시 동시성 문제가 따라옵니다. 이번 글에서는 Java에서 동시성 문제를 해결하기 위해 사용하는 synchronized, Lock Stripping, Atomic Type에 대해 알아보겠습니다. synchronized 자바에서 synchronized 키워드는 메소드 또는 블록을 동기화하는데 사용합니다. synchronized가 붙은 메소드나 블록은 멀티 쓰레드이더라도 동시에 하나의 쓰레드만 접근할 수 있도록 합니다. public synchronized void myMethod() { // 하나의 쓰레드만 메소드 안에 있는 로직을 수행할 수 있다 } p..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eiTPYK/btsv8wH3Jf4/HUYvsDdwDzpv9R3g65t6D0/img.png)
여러 트랜잭션이 동시에 실행된다면 데이터의 무결성에 문제가 생길 수 있으며 여러 트랜잭션을 순차적으로 실행한다면 성능이 좋지 않을 수 있습니다. 트랜잭션의 특징인 ACID 중에서 I인 Isolation level은 여러 트랜잭션을 실행할 때 트랜잭션끼리 얼마나 격리되어 있는 지를 나타냅니다. 트랜잭션의 격리 레벨에는 크게 4가지가 있습니다. 격리 레벨이 높은 순서대로 Serializable, Repeatable Read, Read Commited, Read Uncommited가 있습니다. Serializable 수준은 동시 처리 성능이 상당히 떨어지기 때문에 거의 사용되지 않으며 Read Uncommited 수준은 데이터의 무결성에 문제가 생길 수 있기 때문에 거의 사용되지 않습니다. 대부분의 RDBMS..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b3jiST/btsv7dvceBL/WJL3zY6NxrFXmrkYzy9vxk/img.png)
백엔드 애플리케이션을 개발하면서 동시성 문제를 처리해야 하는 경우가 있습니다. DB의 Isolation Level이 있어서 적절한 레벨로 설정해주면 DB에서 동시성 문제는 발생하지 않을까요? 이번 글에서는 동시성 문제를 처리하는 방법에 대해 알아보겠습니다. 트랜잭션의 Isolation Level 트랜잭션의 특징인 ACID에서 I를 나타내는 Isolation Level은 여러 트랜잭션이 동시에 실행될 때 트랜잭션끼리의 격리 수준을 말합니다. 4가지 레벨이 있는데 격리성이 높은 순서대로 Serializable, Repeatable Read, Read Commited, Read Uncommited가 있습니다. MySQL, InnoDB에서는 기본적으로 Repeatable Read 레벨을 사용합니다. 이 레벨에서..
자바의 for 문에는 일반 for 문과 foreach (향상된 for 문)이 있습니다. 일반 for 문 for (int i = 0; i < 10; i++) { System.out.println(members[i]); } foreach 문 for (Member member : members) { System.out.println(member); } 지금까지 foreach 문이 간결하고 가독성도 좋기 때문에 자주 사용했습니다. 하지만 foreach 문은 언제 사용할 수 있고 내부 동작 방식에 대해서 의문점이 생겼습니다. 이번 글에서는 foreach 문은 어떤 내부 동작 방식으로 인해 어떠한 조건일 때 사용할 수 있는 지에 대해 알아보겠습니다. 먼저 Iterator, Iterable 인터페이스에 대해 알아보겠..