전체 글 88

Java Thread Tutorial

예시 코드는 깃허브에서 확인하실 수 있습니다 https://github.com/hwanseok-dev/lucky-developer-tutorial/tree/main/io.lucky.java.thread Java Thread Tutorial STEP 1. 메인 쓰레드, 백그라운드 쓰레드 자바 프로그램을 실행하면 쓰레드가 항상 실행됩니다. GC 등을 위해서 백그라운드에서 실행되는 쓰레드도 존재합니다. class HelloWorld { // main 메서드를 실행시키는 하나의 쓰레드가 반드시 동작함 public static void main(String[] args) { System.out.println("Hello World"); } // GC 등 백그라운드 쓰레드도 함께 실행됨 /** * Hello Wor..

DEV/JAVA 2024.04.04

헥사고날 아키텍처 시리즈 10. 아키텍처에 대해 고민을 해보며 얻은 것들

아키텍처에 관심을 가지게된 이유 결론적으로는 개발하는 프로젝트의 복잡도가 증가하면서 수정하는 비용이 커졌기 때문입니다. 비즈니스 요구사항이 점점 복잡해지면서 사용자 관점의 유즈케이스를 코드만 보고 파악하기 어려워졌습니다. 기능 하나를 수정하면 영향을 받는 코드가 많아서 수정하기 어렵기도 하고 수정한 결과에 대한 심리적 안정감도 많이 떨어졌습니다. “수정하기 쉽도록 프로젝트를 구성하려면 어떻게 해야할까?”라는 의문에 답을 찾기 위해서 클린 아키텍처를 떠올렸고, 구체적인 예제 코드를 제공한다는 이야기를 듣고 책 ‘만들면서 배우는 클린 아키텍처’를 읽어보게되었습니다. 이번 글은 책 ‘만들면서 배우는 클린 아키텍처’를 2번 정독하고, 토이프로젝트를 직접 진행해보면서 배우고 느낀 것들에 대해서 이야기합니다. 수정..

DEV/Architecture 2024.04.01

데이터 플랫폼 설계와 구축 | 2장 데이터 웨어하우스만이 아닌 데이터 플랫폼인 이유

2장 데이터 웨어하우스만이 아닌 데이터 플랫폼인 이유 요약 정형 데이터와 반정형 데이터를 모두 대응해야하는 경우, 데이터 플랫폼을 구성해야 한다 웨어하우스방식은 수집된 데이터를 바로 웨어하스에 저장하지만, 플랫폼 방식은 블롭 스토리지와 데이터브릭스를 사용해서 수집, 임시저장, 처리의 계층을 분리하였다 웨어하우스 방식과 달리 플랫폼 방식은 입력 스키마 변경에 자유로울 수 있다 웨어하우스 방식과 달리 플랫폼 방식은 JSON과 같은 반정형 데이터가 분석 될 때에도 모듈화, 테스트, 유지보수성을 제공할 수 있다 플랫폼 방식에서 수집, 임지 저장, 처리의 계층을 분리한 덕분에 스키마 변경에 대해서 더욱 자유로울 수 있고, 스파크와 같은 분산 데이터 처리 엔진을 사용할 수 있게 된다 데이터 플랫폼을 사용하는 사용자..

DEV/Data Platform 2024.03.31

데이터 플랫폼 설계와 구축 | 1장 데이터 플랫폼 소개

0.0. 요약 데이터 분석의 목적 : 비즈니스 행위의 방향을 결정하기 위함 데이터 웨어하우스 + 데이터 레이크 = 데이터 플랫폼 데이터 플랫폼의 3가지 문제점 : 규모, 다양성, 속도 데이터 웨어하우스 → 클라우드 데이터 플랫폼으로 전환 수집 , 스토리지 , 처리, 서비스 계층의 분리 실시간 스프림 데이터와 배치 데이터의 분리 서비스 계층의 3가지 역할 비즈니스 부서 : 보고서, 대시보드, 가공된 데이터 분석가 : SQL, (가공된) 정형 데이터 개발자 : 익숙한 프로그래밍 언어, 원시 데이터 조회 공부할 개념 수집 계층 : 카프카 커넥트 (플러그앤 플레이 수집 기능) 처리 계층 : 스파크(잘 알려진 파일 형식 파싱) 수집 계층 클라우드 데이터 웨어하우스 구글 : 빅쿼리 AWS : 레드시프트 애저 : 시..

DEV/Data Platform 2024.03.30

SpringBoot 3.* Swagger 적용 방법

SpringBoot 프로젝트 SpringBoot 프로젝트에서 swagger-ui를 적용하려면 build.gradle에 아래의 의존성을 추가하면 됩니다. 의존성 추가 org.springdoc springdoc-openapi-starter-webmvc-ui 2.4.0 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.4.0' 다른 설정이 없다면 아래의 경로로 API DOCS에 접근할 수 있습니다. http://127.0.0.1:8080/swagger-ui/index.html API DOCS URL 수정 만약 진입 경로를 수정하고 싶으면 application.properties # swagger-ui custom path springdoc..

DEV/Spring MVC 2024.03.23

헥사고날 아키텍처 시리즈 9. 주의사항

헥사고날 아키텍처를 적용해보면서 제가 직접 고민하고 깨닫고 실수했던 사항들입니다. 직접 프로젝트를 하면서 생각나는 부분들이 있으면 채워두겠습니다. 구조 관점 멀티 모듈에서 모듈은 배포 단위로 구성하는 것이 좋습니다. 프로젝트가 모듈 A,B,C로 나누어져있고 모듈 C가 모듈 A,B를 의존하고 있는 상황이라면 하나의 모듈 안에 패키지 구조로 세부 도메인 A,B,C를 나누는 것을 고려해보아야합니다. 세부 도메인을 별도의 모듈로 나누는 시점은 배포를 따로 해야하는 타이밍일 수 있습니다. 애플리케이션 계층 트랜잭션 처리는 애플리케이션 계층에서 이루어저야한다. @Transactional을 사용한다면 AOP의 특징을 반영한 아래의 주의 사항을 참고하자 // TODO @Transactional 사용시 주의사항 트랜잭션..

DEV/Architecture 2024.03.20

데이터베이스 트랜잭션과 락 2

트랜잭션의 격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ 1. READ UNCOMMITTED O O O 2. READ COMMITTED O O 3. REPREATABLE READ O 4. SERIALIZABLE 1. READ UNCOMMITTED 커밋되지 않은 데이터를 읽을 수 있습니다. 여러개의 트랜잭선이 동시에 수행되고 있을 때, 다른 트랜잭션에서 수정하고 아직 커밋하지 않은 데이터를 조회할 수 있습니다. 이를 DIRTY READ라고 합니다. 트랜잭선 A에서 수정하고 커밋하지 않은 데이터가 트랜잭션 B에서 DIRTY READ된 뒤에 커밋되지 않고 롤백된다면 데이터 정합성에 문제가 발생할 수 있습니다. 2. READ COMMITTED 커밋된 데이터만..

DEV/Spring Data JPA 2024.03.19

MySQL의 락

글로벌 락 글로벌 락은 MySQL에서 제공하는 락 중에서 가장 범위가 큽니다. 일단 하나의 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 다른 대부분의 DDL, DML 문장이 대기 상태로 됩니다. 글로벌 락이 영향을 미치는 범위는 MySQL 서버 전체이며, 작업 대상 테이블이나 데이터베이스의 범위를 넘어섭니다. 글로벌 락은 여러 데이터베이스에 존재하는 MyISAM이나 Memory 테이블에 대해서 mysqldump로 일관된 백업을 받아야 할 때 사용합니다. InnoDB는 트랜잭션을 지원하기 때문에 일관된 데이터 상태를 위해 모든 데이터 변경 작업을 멈출 필요는 없습니다. 글로벌 락은 FLUSH TABLES WITH READ LOCK 명령어로 획득할 수 있습니다. 이 작업은 모든 읽기 작..

DB/MySQL 2024.03.18

데이터베이스 트랜잭션과 락 1

트랜잭션과 락 트랜잭션과 락이 비슷한 개념으로 헷갈릴 수 있지만 목적에서 분명한 차이가 있습니다. 트랜잭션은 데이터의 정합성을 보장해주는 기능이고 락은 동시성을 제어하기 위한 기능입니다. 트랜잭션은 작업의 완정성을 보장해줍니다. 논리적인 작업 셋을 모두 처리하거나 모두 처리되지 않도록 처리해줍니다. 락은 동시성을 제어하기 위한 기능입니다. 만약 하나의 회원 정보에 여러 커넥션이 동시에 접근했을 때 락이 없으면 데이터를 동시에 변경하게 됩니다. 락은 여러 커넥션이 동시에 동일한 자원을 요청할 때 한 시점에는 하나의 커넥션만 변경할 수 있도록 보장해주는 역할을 합니다. 더 나아가서, 트랜잭션의 격리 수준은 여러 트랜잭션 사이에서 작업 결과를 어떻게 공유하고 차단할 것인가를 결정하는 레벨입니다. 트랜잭션의 범..

DEV/Spring Data JPA 2024.03.18

데이터베이스 트랜잭션 기초

데이터베이스 종류에 따른 인터페이스 통합 애플리케이션에서 데이터베이스를 사용할 때, 커넥션 연결 → 쿼리 전달 → 응답 반환의 흐름을 사용한다. 그런데 데이터베이스마다 커넥션을 연결하는 방법이 다르다. 이를 통일하기 위해서 JDBC 표준 인터페이스가 만들어졌다 (DriverManager) 일반 커넥션과 커넥션 풀의 도입 데이터베이스 커넥션을 사용할 때 커넥션 풀을 사용한다 직접 커넥션을 연결할 수도 있고, 커넥션 풀을 사용할 수도 있다. 커넥션을 조회하는 방법을 추상화한게 DataSource이다 DriverMangerDataSource HikariDataSource 트랜잭션의 도입 DataSource에서 가져온 커넥션에 대해서 JDBC 코드를 반복해서 작성해야 한다 자동커밋과 수동 커밋에 대한 옵션을 직..

DEV/Spring Data JPA 2024.03.18