배경회사에서 개발 중인 솔루션에서는 서로 다른 도메인(사용자, 업무 코드)에 속한 특정 필드 간에 중복이 허용되지 않는 제약 조건이 필요했다. 문제는 이 제약이 단일 테이블이나 단일 도메인 수준에서 해결될 수 있는 성격이 아니라는 점이었다.해당 솔루션은 GitLab을 미들웨어로 연계하고 있으며, GitLab은 URL 기반 네임스페이스 구조를 사용한다.https://gitlab.com/{namespace}/{project}이 구조로 인해 GitLab 사용자 아이디와 GitLab 그룹명은 서로 중복될 수 없다. 네임스페이스 충돌은 곧 GitLab 리소스 접근 오류로 이어지기 때문이다.솔루션에서는 이를 다음과 같은 정책으로 매핑하고 있었다.GitLab 사용자(User)는 솔루션의 "사용자 아이디"를 기준으로 ..
1. 트랜잭션이란?트랜잭션은 "모든 작업이 성공하거나, 모든 작업이 실패하거나" 하는 원칙으로 ACID 특성을 갖는다.Atomicity (원자성): 모두 성공하거나 또는 모두 실패Consistency (일관성): 트랜잭션 전후 데이터 무결성 유지Isolation (격리성): 동시 실행되는 트랜잭션들이 서로 간섭 안 줌Durability (지속성): 성공한 트랜잭션은 영구적으로 저장2. Spring 트랜잭션 구조Controller ↓Service (프록시 객체) ↓TransactionInterceptor ↓PlatformTransactionManager ↓TransactionSynchronizationManager ↓DataSource / JDBC Connection각 요소별로 역할을 살..
CQRS는 명령(Command)와 조회(Query) 책임을 명확히 분리하는 아키텍처 패턴이다.데이터를 변경하는 작업과 조회하는 작업을 서로 다른 모델, 더 나아가 다른 저장소로 분리하는 방식이다.분리하는 모델의 타입은 두 가지로 우선 간략하게 요약하면 아래와 같다.Command Model (Write Model)상태 변경 목적트랜잭션 중심복잡한 비즈니스 규칙과 도메인 로직 포함Event Sourcing과 결합되기도 함Query Model (Read Model)조회 목적고성능, 고속 응답단순화된 읽기 전용 View / DTODB를 별도로 두거나 Read Replica로 구성해 조회 부하 분산Command와 Query를 왜 나눌까?쓰기와 읽기의 서로 다른 성격 (서로 다른 관심사)Write는 도메인 규칙 준..
해당 정보를 기록하게 된 이유 스프링을 하면서 POJO 라는 명칭은 많이 들어보았는데, 단 한 번도 찾아보거나 관심을 가졌던 적이 없어서 한 번은 그래도 알아보아야 겠다 라고 생각하여 이번 기회에 찾아보고 정리하게 되었다. POJO (Plain Old Java Object) POJO는 Plain Old Java Object의 약자로, 말 그대로 오래된 방식의 자바 오브젝트라는 것이다. 점차 중량 프레임워크들을 사용하게 되면서 프레임워크에 종속된 객체를 만들게 된 것에 반발해서 사용된 용어이다. 참조글을 확인해보고 정리한 더 쉬운 말로는, 객체 지향의 원리에 충실하면서 환경이나 기술에 종속되지 않고 재활용될 수 있는 방식으로 설계된 오브젝트를 뜻한다. POJO의 조건 특정 규약에 종속되지 않는다. 자바 언..
똑같은 쿼리 로그로 콘솔만 길어지는게, 보기 불편해서 sqlonly만 띄우도록 설정했다. 일단, sqltiming 부터 콘솔에 띄우지 않도록 하기 위해 해당 로그의 클래스를 파악해야했다. 로그 관련 클래스를 만들어서 로깅이벤트 네임을 출력해보고, 일단 당장 모든 로그를 허용하도록 리턴해준다. package rootPackage.log; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; public class LogbackFilter extends Filter{ @Override public FilterReply de..
처음으로 스프링 시큐리티를 적용하고, 빠르게 개발 중에 이상하게 로그인 요청만 하면 에러가 떴다. 콘솔은 감감무소식이고, 에러 페이지를 커스텀하여 해당 페이지에는 '에러페이지' 단 다섯 글자만 띄워서 에러를 찾을 수 없었다. 잠시 커스텀 에러 페이지 컨트롤러를 없애고 다시 에러를 확인했다. Forbidden, 403 에러. 권한 문제로 발생하는 오류로, 스프링 시큐리티는 csrf 토큰이 필요한데 이가 없어서 발생한다. 설정 클래스 내에 httpSecurity.csrf().disable();를 입력해준다. 전체적인 코드는 아래와 같고, 중요한 것은 HttpSecurity 를 인자로 받는 configure 메소드를 확인하면 된다. import org.springframework.context.annotati..
pom.xml org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16 driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy url=jdbc:log4jdbc:mariadb://000:3306/db log4jdbc.log4j2.properties log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator log4jdbc.dump.sql.maxlinelength=0 위와 같이 작성했음에도 오류가 발생했다. org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'n..
- Total
- Today
- Yesterday
- springboot
- Spring
- k8s
- kubernetes
- 마리아디비
- mariadb
- nodejs
- 스프링
- 파이썬
- AWS
- 톰캣
- Minikube
- MySQL
- 쿠버네티스
- 쿼리
- java
- 도커
- BeautifulSoup
- JavaScript
- server
- 로그
- 오라클
- 알고리즘
- 크롤링
- 클라우드
- MongoDB
- oracle
- 자바스크립트
- docker
- 스프링부트
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |