본문 바로가기
반응형

분류 전체보기57

[Database] 3. DB락 개념 이해 동시에 같은 데이터를 수정하게 될 경우 DB락이 어떻게 동작하는지 정리하려 한다. 1. 문제점 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안(커밋 연산이 일어나기 전) 세션2에서 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 첫번째, 트랜잭션의 원자성(트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다는 원칙)이 깨진다.두번째, 세션1이 커밋 연산이 아닌 롤백 연산을 실행하게 될 경우, 세션2는 잘못된 데이터를 수정하게 된다. 이와 같은 문제를 방지하려면, 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안(커밋이나 롤백 연산이 일어나기 전) 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다. 데이터베이스는 이런 문제를 해결하기 위해 락(Lo.. 2024. 6. 4.
[Spring] Querydsl Gradle 설정 (Spring Boot 3.0 이상) Querydsl 학습하면서 부딪혔던 이슈에 대해 정리한다. 1. 이슈의 원인 IntelliJ가 버전업하거나 Querydsl의 Gradle 설정이 버전업하면서 적용 방법이 달라지기도 하며, 각자의 환경 설정에 따라 정상적으로 동작하지 않을 수 있다. 현재 나의 SpringBoot 버전은 3.2로 3.0 이하의 설정으로는 Querydsl이 정상적으로 동작하지 않아 버전에 맞게 설정을 해줘야 했다. Querydsl 설정은 공식 매뉴얼에 소개되어 있지 않아 본인 환경에 맞는 대안을 찾아 설정해야 한다. 2. 원인 해결 프레임워크 설정 추가 build.gradle 파일의 dependencise 영역에 프레임워크 설정을 추가한다. // Querydsl 설정 추가 implementation 'com.querydsl:.. 2024. 4. 18.
[Database] 2. 데이터베이스 연결 구조와 DB 세션 트랜잭션을 자세히 이해하기 위해 데이터베이스의 서버 연결 구조와 세션에 대해 정리하려 한다. 1. 데이터베이스 연결 구조 1 사용자는 클라이언트(WAS, Database tools, SpringBoot, H2 Console)를 사용하여 데이터베이스에 접근할 수 있는데, 이때 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺고 데이터베이스 서버는 세션을 생성한다.그리고 해당 커넥션을 통한 모든 요청은 생성된 세션을 통해 실행된다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료하며 사용자가 커넥션을 닫거나 데이터베이스 관리자가 세션을 강제로 종료하면 해당 세션은 종료된다. 2. 데이터베이스 연결 구조 2 커넥션 풀이 10개의 커넥션을 생성했다면, 세션도 10개가 생성된다.이는.. 2024. 4. 18.
[Architecture] 4. 육각형 아키텍처(헥사고날 아키텍처) 이번 챕터에서는 두 가지 아키텍처 스타일 중 두번째 육각형 아키텍처(헥사고날 아키텍처)에 대해 이야기 한다. 1. 육각형 아키텍처(헥사고날 아키텍처) 육각형 아키텍처는 애플리케이션 코어가 각 어댑터와 상호 작용하기 위해 특정 포트를 제공한다. 육각형 안에는 도메인 엔티티와 이와 상호 작용하는 유스케이스가 있다. 육각형 외부로 향하는 의존성이 없기 때문에 마틴이 클린 아키텍처에서 제시한 의존성 규칙이 그대로 적용된다. 대신 모든 의존성은 코어로 향한다. 육각형 바깥에는 애플리케이션과 상호 작용하는 다양한 어댑터들이 있다. 왼쪽에 있는 어댑터들은 애플리케이션 코어를 호출하기 때문에 애플리케이션을 주도하는 어댑터(driving adapter)들이다. 반면 오른쪽에 있는 어댑터들은 애플리케이션 코어에 의해 호출.. 2024. 4. 16.
[Architecture] 3. 클린 아키텍처(Clean Architecture) 이번 챕터에서는 두 가지 아키텍처 스타일 중 첫번째 클린 아키텍처에 대해 이야기 한다. 1. 클린 아키텍처 로버트 C. 마틴이 정립한 용어로, 클린 아키텍처에서는 설계가 비즈니스 규칙의 테스트를 용이하게 하고, 비즈니스 규칙은 프레임워크, 데이터베이스, UI 기술, 그 밖의 외부 애플리케이션이나 인터페이스로부터 독립적일 수 있다고 이야기 한다. 이는 도메인 코드가 바깥을 향하는 어떤 의존성도 없어야 함을 의미하며, 대신 의존성 역전의 원칙의 도움으로 모든 의존성이 도메인 코드를 향한다. 클린 아키텍처에서 가장 주요한 규칙은 의존성 규칙으로, 계층 간의 모든 의존성이 안쪽을 향해야 한다는 것이다. 아키텍처 코어에는 유스케이스에서 접근하는 도메인 엔티티가 존재하며, 유스케이스는 단일 책임을 갖기 위해 조금 .. 2024. 4. 15.
[Database] 1. 트랜잭션에 대한 이해 트랜잭션을 도입하는 이유나 사용법에 대해선 알고 있으나, 자세한 이해가 부족한 상태라 개념을 다지기 위해 정리하려 한다. 1. 트랜잭션이란 여러 개의 작업을 하나로 묶은 실행 유닛을 말하며, 데이터베이스 관점에서는 상태를 변화시키는 기능을 수행하기 위한 하나 이상의 쿼리를 모아 놓은 논리적 작업 단위를 말한다. 2. 트랜잭션의 ACID 원자성(Atomicity) 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. 일관성(Consistency) 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어, 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성(Isolation) 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 .. 2024. 4. 11.
[Architecture] 2. 계층형 아키텍처의 대안 첫번째 챕터에서는 계층형 아키텍처의 문제점에 대해 이야기하였다. 이번 챕터에서는 계층형 아키텍처의 대안에 대해 이야기 한다. 1. 단일 책임 원칙 단일 책임 원칙의 일반적인 해석은 아래와 같다. "하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다." 이는 단일 책임이라는 말을 가장 직관적으로 해석한 것으로, 단일 책임 원칙이라는 이름에 오해의 여지가 있다는 점을 주의해야 하며, 단일 책임 원칙의 실제 의도가 아니다. 단일 책임의 원칙의 실제 정의는 아래와 같다. "컴포넌트를 변경하는 이유는 오직 하나 뿐이어야 한다." '책임'은 '오로지 한 가지 일만 하는 것'보다 '변경할 이유'로 해석해야 한다. 컴포넌트를 변경할 이유가 오로지 한 가지라면 컴포넌트는 딱 한 가지 일만 .. 2024. 4. 11.
[Architecture] 1. 계층형 아키텍처의 문제 '만들면서 배우는 클린 아키텍처' 책을 통해 클린 아키텍처를 공부하면서 알게된 내용을 기록하고 정리하기 위해 시리즈를 작성하려고 한다. 해당 챕터에서는 사내 솔루션의 아키텍처인 계층형 아키텍처의 문제에 대해 이야기한다. 1. 계층형 아키텍처의 문제는 무엇일까? 일반적인 3계층 아키텍처는 웹 계층에서 요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 보내 필요한 비즈니스 로직을 수행하고, 도메인 엔티티의 상태 조회 혹은 변경을 위해 영속성 계층의 컴포넌트를 호출한다. 계층형 아키텍처는 견고한 아키텍처 패턴이다. 계층을 잘 이해하고 구성한다면 웹 계층이나 영속성 계층에 독립적으로 도메인 로직 작성이 가능하고, 도메인 로직에 영향을 주지 않고 웹 계층과 영속성 계층에 사용된 기술의 변경도 가능하.. 2024. 4. 9.
[Error] java.net.socketexception: permission denied 오류 발생 웹 어플리케이션을 운영에 적용하기 위해 제공 받은 인증서로 SSL 설정을 하니 tomcat 구동시 아래와 같은 오류가 발생하여 해결 방법을 작성하려 한다. java.net.socketexception: permission denied ... 오류 발생 원인 리눅스에서는 일반 사용자에게 Wellknwon port의 사용 권한을 부여해주지 않아 발생하는 오류로 확인되었다. Wellknwon port란 0 ~ 1023 까지의 port를 말하며 해당 port를 사용하려면 root 권한이 필요하다. 해결 방법 sudo 권한을 부여 받은 후 sudo ./startup.sh 명령어를 실행하니 정상적으로 구동되는 것을 확인할 수 있었다. END 2023. 12. 15.
반응형