728x90

JPA를 사용하여 데이터베이스에 락을 거는 방법은 2가지방법을 뽑아 볼 수 있습니다.

 

테이블에 행하는 행위 ( 조회, 수정, 등록, 삭제 )를 막는 비관적 락과 데이터에 버전을 명시하고 해당 버전을 통해 데이터의 일관성을 보장하는 낙관적 락이 이 경우입니다.

 

비관적 락  - Pessimistic Lock

비관적락은 데이터를 조회하고 특정 작업을 할 때 테이블에 어떤 작업도 일어나면 안되는 상황에서 사용하기 적합하다고 볼 수 있습니다.

이는 데이터의 정확성과 일관성을 보장하는 방법이며, 이 방법은 테이블에 락을 거는 행위로 성능에 큰 영향을 끼칠 수 있습니다.

 

데이터베이스의 종류에 따라 락을 걸었으나 데이터가 조회되는 경우도 있으니 이는 어떤 데이터베이스를 사용하는지를 확인을 하고 잘 선택하기 바랍니다.

public interface LectureJpaRepository extends JpaRepository<LectureEntity, Long> {
    //
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Query("select l from LectureEntity l where l.id = :id")
    Optional<LectureEntity> findByIdForUpdate(long id);
}

사용법은 위와 같이 조회할 때 @Lock 어노테이션을 통해 Lock을 시작하는 Start point를 설정해줍니다.

 

LockkModeType에는 아래와 같은 옵션들을 선택하여 적용할 수 있습니다.

LockModeType Action
READ Entity의 버전을 확인합니다. - jpa1.0 버전 호환
WRITE Entity가 변경이 되지 않더라도 버전을 자동으로 올려줍니다. - jpa1.0 버전 호환
OPTIMISTIC thread가 종료될 때 Entity의 버전을 확인합니다.
OPTIMISTIC_FORCE_INCREMENT Entity가 변경이 되지 않더라도 버전을 자동으로 올려줍니다.
PESSIMISTIC_READ 데이터베이스가 지원하면 비관적락을, 지원하지 않다면 명시적 락으로 통해 읽기는 가능하지만 CUD는 할 수 없어집니다.
PESSIMISTIC_WRITE 해당 쓰레드를 제외 나머지 모든 쓰레드는 lock이 해제될때까지 Block됩니다.
PESSIMISTIC_FORCE_INCREMENT 비관적으로 잠기고, Entity가 변경되지 않더라도 버전이 자동으로 오릅니다.
NONE 잠금을 걸지 않습니다.

 

public class LectureService {

    @Transactional
    public Lecture loadLecture(long lectureId) {
		// 조회 -  Lock시작
        // 작업들
        //종료 - Transaction이 종료될 때 Lock을 풉니다
    }

}

 

비관적 락의 경우 Transaction내에서 유지되며, 해당 영역 내에서 작업을 끝내야 데이터의 일관성을 유지할 수 있습니다.

너무 많은 처리 및 Transaction전파에 의해 Lock이 길어질 수 있어 주의가 필요합니다.

낙관적 락  - Optimistic Lock

Version데이터를 통해 데이터의 일관성을 보장하는 방법입니다.

 

비관적락과 달리 테이블을 잠그거나 하지는 않지만, 버전이 다를 경우 데이터 수정작업 등을 처리하지 않는 것으로 동시성을 처리하였습니다.

 

비관적락에 비해 사용하기 쉽다는 장점이 있으며, 테이블을 잠그지 않기 때문에 성능적인 측면에서 더욱 효율적으로 관리할 수 있는 방법입니다.

단점으로는 버전을 통해 데이터의 일관성을 유지하기 때문에 동시에 여러번의 요청이 들어올 경우 많은 데드락이 발생 할 수 있습니다.

 

아래와 같은 방법으로 Entity에  @Version어노테이션을 사용함으로써 간단하게 명시 할 수 있습니다.

@Entity
public class LectureEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Version
    private int version
}

 

버전의 타입으로는 int, Long, TimeStemp와 같은 자료를 사용할 수 있으며,  TimeStemp의 경우 데이터의 일관성을 보장하기에는 int와 Long타입에 비해 부적절하지만, 상황에 따라 사용하는 경우가 존재한다고 합니다.


데이터베이스에서 락을 거는 만큼 무분별한 락사용과 제대로 된 설계가 아닐 경우 큰 성능적인 이슈를 야기할 수 있습니다.

 

이를 염두하고 적절한 락을 사용하는 것을 권장합니다.

또한 이 블로그글은 Hibernate구현체, Mysql기준으로 작성된 만큼 다른 데이터베이스, 또한 다른 기능들과 같이 사용할 경우 위에 소개한 상황과 다른 상황들이 발생할 수 있으니 확인해보시기 바랍니다.

 

Hibernate공식문서: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#locking

728x90

'Java' 카테고리의 다른 글

[ThreadLocal] Thread영역에 데이터를 저장하고 싶어요  (1) 2025.01.27
오차 없는 실수 연산 어떻게 해야 할까?  (0) 2025.01.10
[Java] Static  (3) 2024.12.26
[ Basic ] I/O Stream이란?  (0) 2024.12.23
JPA는 어떤 기술일까?  (0) 2024.04.12
728x90

1주차에는 TDD를 주 주제로 강의 및 과제를 하였습니다.

 

우선 TDD

TDD는 단위테스트, 통합테스트, E2E테스트로 이루어져있으며,

여기서 단위테스트는 하나의 Class내 작동 방식을 테스트한다고 보면 

통합테스트는 두개 이상의 모듈을 엮어 테스트 한다고 생각하면 좋을 것 같습니다.

 

E2E테스트는 실제 애플리케이션 구동 환경처럼 애플리케이션을 실행시켜하는 테스트로 API호출 부터 데이터베이스까지 조회, 및 테스트 시나리오대로 정상적으로 잘 작동하는지 테스트를 합니다.

 

단위테스트를 작성이 우선적으로 진행되고 그다음 테스트가 부족하면 통합테스트, 그다음 E2E테스트를 작성을 하는 것이라 생각하며,

TDD를 실제로 많이 사용하지 않았던만큼 테스트를 자동화 하는 부분을 고민해볼 것 같습니다.

 

 

 

 

GitHub - KrongDev/hhplus-tdd-java: 항해 플러스 1주차 TDD 동시성 제어 과제

항해 플러스 1주차 TDD 동시성 제어 과제. Contribute to KrongDev/hhplus-tdd-java development by creating an account on GitHub.

github.com

 

728x90
728x90

2024.06.15부터 항해99의 플러스 백엔드 5기가 시작하게 되었습니다.

 

개인적으로 플러스 백엔드를 시작하게 된 이유는 기본기의 부족함을 느껴서가 큰 이유인데요,

이번에 코칭 및 과제를 수행하면서 자신있는 부분과 부족한 부분을 찾을 수 있는 시간이 되었으면 좋겠습니다.

 

시작하는 마음은 기대반 두려움반인데요.

기대는 제대로 코칭 및 동료분들과 서로 협력하며 발전을 하는 것에 대한, 그리고 이제부터 수행하게될 과제들에 대한 기대가 많은 것 같습니다.

두려움은 앞으로 수행해야할 과제들에 대해 잘 수행할 수 있을 지, 문제는 발생하지 않을 지, 동료분들과 잘 지낼 수 있을까 마지막으로 제가 지금까지 학습한 내용들이 잘못 된 것은 아닐까 하는 마음이 큰거 같습니다.

 

적지 않은 금액을 지불하고 시작하는 만큼 적어도 제가 원하는 바는 이를 통해 이룰 수 있기를 바라는 마음이 커 열심히 10주간의 과정을 수행할 예정입니다. 

728x90
728x90

오늘은 코딩 테스트 사이트인 Hackerrank라는 사이트에 대해 소개를 해볼까 합니다.

 

Hackerrank는 최근 모 기업 코딩테스트를 보면서 처음 만나게 된 사이트인데,

코딩테스트, 기술 체크 등 포괄적으로 본인이 가지고 있는 기술을 체크할 수 있는 사이트인 거 같습니다.

 

코딩테스트의 경우 Hackerrank는 모든 문제가 영어로 작성되어있는 만큼 문제 해석에 시간이 오래 걸릴 수 있는데요,

이러한 점 때문에 프로그래머스, 백준 보다 문제 자체를 이해하는데 살짝 어렵다고 개인적으로 느꼈습니다.

 

코딩 문제의 경우 백준 기준 브론즈부터 골드 1문제까지의 난이도를 만나보았으며, 문제의 난이도와 종류 그리고 언어에 따른 문제들도 다양하게 존재하고 있습니다.

 

코딩 테스트를 연습하고 싶다!! 라고 한다면 30 Days of code 라는 챌린지 형태의 튜토리얼도 지원해 주어 코딩 테스트 준비가 어색하다 하면 한 번쯤 해보는 것을 추천드립니다. 난이도는 매우 쉬움부터 날이 갈수록 어려워지는 구조로 코딩 테스트라는 것에 익숙해지는데 도움을 많이 받았습니다.

 

일반 코딩테스트 문제들만 존재한다면 굳이 소개를 할 필요는 없겠죠 제가 소개하게된 큰 이유는 기술 검증 메뉴에 있습니다.

 

이 기술 검증이란 주어진 시간내에 해당 주제에 대해 여러 문제들을 주고, 이를 통과하였을 때 인증서를 제공하는 서비스인데요,

Java와 Sql등 여러 가지의 언어들과 테스트할 수 있는 것들이 존재하는 만큼 본인이 어느 정도 자신이 있다 생각하면 한번 응시하여 기술 검증을 받아보는 것이 좋을 것 같습니다.

 

기술 검증은 계정당 1회 가능하며 만약 통과를 하지 못할 경우 재응시가 불가 하니 주의 바랍니다.

추후 업데이트를 통해 재응시가 가능하도록 하겠다 하지만 언제 업데이트가 이뤄질지 모르니 공부하고 응시해 보시기를 권장합니다.

 

기술 검증에 통과하게 되면 아래와 같이 이쁜 인증서도 지급해주니 인증서를 모아보는 것도 하나의 취미로 삼아도 괜찮을 것 같습니다.

 

HackerRank Skill Certificate

Join over 23 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

 

 

Dashboard | HackerRank

Join over 23 million developers in solving code challenges on HackerRank, one of the best ways to prepare for programming interviews.

www.hackerrank.com

 

728x90
728x90

작업 환경

OS: Ubuntu

Tool: Intellij

Builder: gradle

Framework: Spring-Boot

Language: Java

KafkaVersion: kafka_2.13

Kafka 설치 및 실행

  1. zookeeper 실행
# 다운받은 kafka 디렉토리 내에서 실행하였을 때 경로
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/zookeeper-server-start.sh ./config/zookeeper.properties 
  1. kafka-server 실행
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-server-start.sh ./config/server.properties
  1. topic 생성 - 이벤트 저장할 주제
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-topics.sh --create --topic ${원하는topic명:kafka-test} --bootstrap-server ${사용하길 원하는 주소:localhost:9092}
  1. topic 생성 확인
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-topics.sh --describe --topic ${topicName:kafka-test}  --bootstrap-server ${Address:localhost:9092}
Topic: kafka-test    TopicId: JW42CEjhS1qqnwIZ1cvdzQ    PartitionCount: 1    ReplicationFactor: 1    Configs: 
    Topic: kafka-test    Partition: 0    Leader: 0    Replicas: 0    Isr: 0
  1. Producer로 Event 발신
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-console-producer.sh --topic ${topicName:kafka-test} --bootstrap-server ${Address:localhost:9092}
>This is my first event
  1. Consumer로 Event수신
xxx@kafka:~/kafka_2.13-3.6.1$ ./bin/kafka-console-consumer.sh --topic ${topicName:kafka-test} --bootstrap-server ${Address:localhost:9092}

Docker로 작업

  1. Apache Kafka Image Download
docker pull apache/kafka:3.7.0
  1. Kafka Docker Container 생성 및 실행
docker run -p 9092:9092 apache/kafka:3.7.0 

 


참고

https://kafka.apache.org/quickstart

 

작업공간

https://github.com/KrongDev/kafka

728x90
728x90

초기화 단계

1. Awake

실행시 처음 한번만 실행

종속성 초기화를 할 때 사용

2. OnEnable

오브젝트 활성화 시 실행

초기화 혹은 오브젝트 재설정 할 때 사용

3. Start

첫번째 프레임이 업데이트 되기 전에 호출

Awake()이후 활성화 된 상태일 때 처음 한번만 호출

초기 설정할때 사용


게임 플레이 단계

1. FixedUpdate

물리연산( 고정 ) 주기로 실행

물리연산과 관련된 업데이트에 사용

2. Update

매 프레임마다 실행

게임 작동 로직등에 호출

3. LateUpdate

Update()호출 이후에 실행

애니메이션, 카메라 등 후처리에 사용


비활성화 및 종료 단계

7. OnDisable

오브젝트 비활성화시 실행

이벤트 핸들러 해제, 타이머 정지 등 필요한 정리 작업에 사용

8. OnDestroy

오브젝트 해체할 때 실행

메모리 해제 및 자원 정리 시 사용

728x90

'Unity' 카테고리의 다른 글

Basic Unity Moving  (0) 2024.06.02
Basic Unity Interface  (0) 2024.06.02
728x90

1. 화면

Action Description Etc
Q + 드래그 화면을 이동할 수 있다  드래그 버튼을 눌러 움직였을 때 같은 효과를 볼 수 있습니다.
W +  드래그 오브젝트를 이동할 수 있다  
E + 드래그 오브젝트를 회전할 수 있다. 선과 내부 회색 구체로 자유로운 회전가능
R + 드래그 오브젝트 크기를 조절할 수 있다.  
T 사각툴 2D에서 사용

 2. 카메라

Action Description Etc
우클릭 카메라 회전  
Alt + 좌클릭 오브젝트 기준으로 카메라 회전  
방향키 카메라 자유이동  
카메라 줌 누를 시 이동
728x90

'Unity' 카테고리의 다른 글

Frame Lifecycle in Unity  (0) 2024.06.02
Basic Unity Interface  (0) 2024.06.02
728x90

기본적인 Unity화면 구성요소에 대해 알아보겠습니다.

 

 

1. Hierarchy

게임구성에 필요한 오브젝트들을 계층구조로 관리하는 부분

2. Scene

오브젝트들을 실제 배치하는 부분

카메라를 통해 인게임 내 송출되는 화면을 확인하며 작업이 가능합니다.

XYZ, 회전등을 통한 자유로운 화면 조절 및 오브젝트 배치가 가능합니다. 

3. Inspector

오브젝트들의 속성들을 확인하고 관리하는 부분

오브젝트에 애니메이션, script등을 주입하는 곳입니다.

4. Projects

프로젝트전체를 관리하는 부분

 

728x90

'Unity' 카테고리의 다른 글

Frame Lifecycle in Unity  (0) 2024.06.02
Basic Unity Moving  (0) 2024.06.02

+ Recent posts