일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jpa
- MVCC
- Locking Read
- 가비지 컬렉터
- Varchar
- 가비지 컬렉션
- CAS
- 백엔드
- Di
- Atomic Type
- 스프링
- foreach
- MySQL
- 동시성
- 자바
- java
- iterable
- reflection
- db
- iterator
- text
- Lock
- 동시성 문제
- 데이터 타입
- Synchronized
- gc
- Today
- Total
목록전체 글 (98)
과정을 즐기자
자바 빈 규약이란 자바에서 재사용 가능한 소프트웨어 컴포넌트를 만들기 위해 정한 규칙을 말합니다. 다음과 같은 자바 빈 규약이 있습니다. 1. 기본 생성자를 반드시 가져야 한다 2. 빈이 패키지화 되어 있어야 한다 3. 멤버 변수의 접근자는 private으로 선언한다 4. 멤버 변수에 접근하기 위한 public 접근자인 getter/setter 메소드가 존재해야 한다 여기서 자바 빈 규약의 4번 예시처럼 getter/setter를 사용하여 외부에서 데이터를 가져오고 변경할 수 있습니다. 하지만 setter의 경우 외부에서 객체의 필드를 마음대로 바꿀 수 있으며 setter라는 메소드가 어떠한 이유로 필드의 값을 변경했는 지를 파악하기 어렵습니다. 따라서 필드의 값을 변경해야 한다면 의미있는 메소드명을 사..

HTTP는 인터넷 상에서 가장 많이 사용되고 있는 애플리케이션 프로토콜입니다. HTTP는 웹에서 데이터를 주고 받는 프로토콜로 클라이언트-서버 구조입니다. HTTP를 사용하여 HTML 문서, 이미지, 동영상을 주고 받을 수 있습니다.HTTP 헤더에는 메세지의 속성 정보, 상태 정보가 있고 HTTP 바디에는 실제로 전송하려는 데이터가 들어갑니다.이러한 HTTP는 1991년부터 시작하여 지속적으로 발전해왔습니다. 이번 글에서는 HTTP의 버전별 특징에 대해 알아보겠습니다.HTTP/0.9처음부터 존재하던 버전은 아니었고 초기 버전으로 구분하기 위해 이후에 붙여진 버전입니다.요청은 단일 라인으로 구성되며 리소스에 대한 메소드는 GET만 존재합니다. HTTP 헤더도 없고 HTML 파일만 전송 가능했던 버전입니다...

개발을 하다보면 직렬화라는 단어를 종종 듣게됩니다. JSON, XML, 프로토콜 버퍼, Java Serialization... 등등 그렇다면 이러한 직렬화는 정확히 무엇이고 왜 사용하는 것일까요? 이번 글에서는 직렬화에 대해 알아보겠습니다. 직렬화란? 직렬화는 현재 데이터 구조나 오브젝트 상태를 영속적으로 저장하거나 다른 환경으로 전달하기 위해 어떠한 정해진 포맷으로 변환하는 과정입니다. 반대로 역직렬화는 직렬화된 포맷을 원래의 데이터 구조나 오브젝트 상태로 복구하는 과정입니다. 그렇다면 이러한 직렬화는 왜 필요한 것일까요? 이를 알아보기 전에 먼저 스택, 힙과 관련된 메모리에 대한 이해가 필요합니다. 스택, 힙 자바를 예시로 들겠습니다. 정수형의 데이터 a, b가 있을 때 이 값들은 모두 스택에 저장되..

바이너리 데이터는 컴퓨터가 이해하기 쉬운 형식의 데이터로 일련의 0과 1로 표현됩니다.이러한 바이너리 데이터는 텍스트 데이터에 비해 효율적으로 저장되며 데이터를 더 빠르게 전송할 수 있습니다.기계가 읽을 수 있는 언어이기 때문에 빠른 처리가 가능하고 오류가 발생할 가능성이 적어집니다.이러한 바이너리 데이터로는 이미지(JPEG), 오디오(MP3), 동영상(MP4) 등이 있습니다.이번 글에서는 이러한 바이너리 데이터를 처리하는 방법에 대해 작성해보려고 합니다.인코딩 방식바이너리 데이터를 처리하는 방법 중 하나로 Base64를 사용하는 인코딩 방식이 있습니다.Base64는 바이너리 데이터를 아스키 코드 일부와 일대일로 매칭되는 문자열로 단순 치환하는 인코딩 방식입니다.즉, Base64를 사용하여 바이너리 데이..

Spring 프레임워크를 이용해 개발하다보면 여러 장점이 있습니다. DI/IoC 컨테이너, 테스트 용이, 그리고 스프링부트를 사용한다면 내장 톰캣, 버전 설정, 자동 구성.. 등 여러 장점이 있습니다. Spring은 객체지향 프로그래밍을 더 잘할 수 있도록 도와줍니다. 각각의 역할과 책임을 분리하도록 개발을 유도하기 때문입니다. 이때 가장 먼저 접하는 아키텍쳐는 Layerd Architecture로 크게 3가지로 나눈다면 클라이언트 요청을 받고 응답을 해주는 Presentation Layer, 비즈니스 로직을 처리하는 Application Layer, 데이터베이스에 접근하는 Data Access Layer로 나눌 수 있습니다. 저도 이러한 구조로 계속 개발을 해왔지만 기능이 많아지고 복잡해질 수록 문제점..

자바는 멀티 쓰레드 기반의 동시성 프로그래밍을 지원합니다. 따라서 CPU 코어가 많아질 수록 이를 잘 활용할 수 있습니다.하지만 멀티 쓰레드이기 때문에 반드시 동시성 문제가 따라옵니다.이번 글에서는 Java에서 동시성 문제를 해결하기 위해 사용하는 synchronized, Lock Stripping, Atomic Type에 대해 알아보겠습니다.synchronized자바에서 synchronized 키워드는 메소드 또는 블록을 동기화하는데 사용합니다.synchronized가 붙은 메소드나 블록은 멀티 쓰레드이더라도 동시에 하나의 쓰레드만 접근할 수 있도록 합니다.객체를 생성하면 각 객체마다 내부적으로 Lock을 가지고 있는데 synchronized를 사용하면 이러한 Lock을 획득하고Lock을 획득할 수 없..

여러 트랜잭션이 동시에 실행된다면 데이터의 무결성에 문제가 생길 수 있으며 여러 트랜잭션을 순차적으로 실행한다면 성능이 좋지 않을 수 있습니다. 트랜잭션의 특징인 ACID 중에서 I인 Isolation level은 여러 트랜잭션을 실행할 때 트랜잭션끼리 얼마나 격리되어 있는 지를 나타냅니다. 트랜잭션의 격리 레벨에는 크게 4가지가 있습니다. 격리 레벨이 높은 순서대로 Serializable, Repeatable Read, Read Commited, Read Uncommited가 있습니다. Serializable 수준은 동시 처리 성능이 상당히 떨어지기 때문에 거의 사용되지 않으며 Read Uncommited 수준은 데이터의 무결성에 문제가 생길 수 있기 때문에 거의 사용되지 않습니다. 대부분의 RDBMS..

백엔드 애플리케이션을 개발하면서 동시성 문제를 처리해야 하는 경우가 있습니다.DB의 Isolation Level이 있어서 적절한 레벨로 설정해주면 DB에서 동시성 문제는 발생하지 않을까요?이번 글에서는 동시성 문제를 처리하는 방법에 대해 알아보겠습니다.트랜잭션의 Isolation Level트랜잭션의 특징인 ACID에서 I를 나타내는 Isolation Level은 여러 트랜잭션이 동시에 실행될 때 트랜잭션끼리의 격리 수준을 말합니다. 4가지 레벨이 있는데 격리성이 높은 순서대로 Serializable, Repeatable Read, Read Commited, Read Uncommited가 있습니다. MySQL, InnoDB에서는 기본적으로 Repeatable Read 레벨을 사용합니다.이 레벨에서는 Loc..
자바의 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 인터페이스에 대해 알아보겠..

스프링 프레임워크를 이용해서 개발을 하다보면 DI라는 말을 자주 듣게 됩니다. 제어의 역전인 IoC는 제어의 권한을 제 3자에게 넘겼다는 말입니다.DI는 IoC의 일종으로 의존관계 주입을 개발자가 직접하는 것이 아니라 프레임워크에게 넘겼다는 말입니다.이러한 사실을 알고 사용하고 있었지만 스프링이 어떻게 의존 관계 주입을 해주는지 그 내부 동작 방식을 알아보고 싶었습니다. 또한 JPA를 사용하다보면 기본 생성자를 필수로 생성해야 한다는 것도 알고 있었지만 어떤 원리로 동작하는지는 정확히 알지 못했습니다. 이 2가지의 공통점이 있는데 바로 Java Reflection을 사용한다는 사실입니다.이번 글에서는 Java Reflection에 대해 알아보고 지금까지 궁금증을 가지고 있었던 내부 동작 방식에 대해 알아..