전체 글
Repository와 DataMapper의 책임 (w/o ORM)
Repository와 DataMapper의 책임 (w/o ORM)
2022.03.09traditional Java EE 패턴에서의 정의 Spring에서 제공하는 @Repository 는 DAO 의미를 지닌다. (javadoc 참조) MyBatis에서 제공하는 @Mapper 는 sql mapper 의미를 지닌다. 따라서 layer는 아래와 같이 표현되어야 한다. ```kt @Service ---> @Repository ---> @Mapper ----> mapper.xml || annotation-string DAO sql mapping ``` 관습적으로 @Repository와 @Mapper를 동일한 layer로 간주하는 경우가 많은데, 서로 다른 layer로 간주해야 한다. "dao와 mapper의 차이" 로 검색해보면, 마치 두 개념이 같은 추상화 수준이며 서로 양립 불가한 것 처럼 보..
[MyBatis] Cache
[MyBatis] Cache
2022.03.08간단히 정리하면, MyBatis는 2가지 캐시를 제공한다. local session cache, second level cache second level cache https://idea-sketch.tistory.com/31 mapper namespace 단위로 적용. `` `` 구문. 캐시 설정 파라미터 : 캐시 size, eviction 방식(e.g., LRU), flushInterval 등 session commit 한다고 캐시가 사라지지 않는다. (설정 파라미터에서 눈치 챌 수 있다.) local session cache https://mybatis.org/mybatis-3/java-api.html - Local Cache 항목 참조 https://idea-sketch.tistory.com/30..
API 응답 코드 계층 구조 설계
API 응답 코드 계층 구조 설계
2022.02.26```js HTTP | | httpStatusCode는 해당 서버로부터 오는 모든 api 응답의 일관된 처리를 위한 error code로서 의미를 가짐 body: { code: ?, --> body.code는 해당 서버로부터 오는 모든 api 응답의 일관된 처리를 위한 error code로서 의미를 가짐 data: { code: ? --> body.data.code는 주로 Enum code. 특정 api 내 범위의 error, 상태 등 } } } // !!body.code 가 httpStatusCode로 모두 커버가 된다면 통합하여 1depth 줄일 수 있음!! ``` ```js @FE에서 받는 다면 http.get(`/api-1/example`) .then(resultCodeHandler( --> bo..
개발을 잘 한다는건 뭘까? 좋은 개발자란?
개발을 잘 한다는건 뭘까? 좋은 개발자란?
2022.02.22이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
나는 풀스택이 아닌데, 풀스택이란 뭘까
나는 풀스택이 아닌데, 풀스택이란 뭘까
2022.02.18FE 개발자들 보면 나 스스로 FE를 할 줄 안다고 생각하는게 얼마나 오만한 생각인지 깨닫고는 한다. 난 그냥 FE, react를 조금 끄적거릴 줄 안다 뿐이지 제대로 된 FE 개발자라고 할 수는 없다. 이런 저런 생각 하다, 최근에 누가 물어본게 떠올라서. 풀스택은 뭘까?에 대해서 짧게 생각해봤다. 풀스택이란 뭘까 보통 사람이 쓸 수 있는 리소스가 100이라고 하면, A: BE에 100 투자했다. B: FE에 100 투자했다. C: BE 50, FE 50 투자했다. 당연히 C는, BE는 A보다, FE는 B 보다 못할거다. 같은 리소스를 분산해서 썼는데, A와 B 각자의 전문 분야에서 그들 만큼 잘하기를 바라는건 욕심이다. 하지만 그렇다고 C가 가치없는 개발자라고 얘기하고 싶은 것은 아니다. 분명 어떤 ..
Intellij Multi Module Project 구성하기 (with Gradle)
Intellij Multi Module Project 구성하기 (with Gradle)
2022.02.16root proejct 하나의 하위에 sub module 여러 개를 두는 방식이 상호 import하기 좋다. 멀티 모듈로 만들기 전에 참고 - https://techblog.woowahan.com/2637/ 여기 나온 사례의 문제점은 common의 의미를, "2개 이상 쓰는 곳이 있다면 common에 넣자"라고 생각해버려서, common이 너무 비대해졌다는 점. common은 모듈 전역적으로 적용되거나 독립 모듈로 구성하기 애매한 것들만 넣고, (비즈로직이 아닌 것) 나머지는 비즈니스 로직 별로 독립 모듈로 쪼개야 common이 비대해지는 것을 막을 수 있다. plasma-benefit/posts/485 이 사례도 참고해볼만 하다. https://share.navercorp.com/neday2022/le..
MERGE INTO(UPSERT) 에서도 PK violation이 발생할 수 있다.
MERGE INTO(UPSERT) 에서도 PK violation이 발생할 수 있다.
2022.02.10상황 요구사항 1) tbl에 없는 경우 INSERT. 있다면 에러 없이 스킵 처리 요구사항 2) 동시에 여러 스레드에서 쿼리 실행해야 함 ```sql MERGE INTO tbl USING dual ON (pk1 = '1') WHEN NOT MATCHED THEN INSERT (pk1) VALUES ('1') ``` ``` ; SQL []; ORA-00001: 무결성 제약 조건(TBL.IPK_PK1)에 위배됩니다 ; nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 무결성 제약 조건(TBL.IPK_PK1)에 위배됩니다 ``` tbl에 없는 경우 INSERT임에도, PK violation이 발생했음. (만약 co..
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDCB Connection을 무한히 대기하는 현상
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDCB Connection을 무한히 대기하는 현상
2022.01.12``` oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found. ``` ```sql select * from v$resource_limit where resource_name = 'processes'; ``` 프로세스 수가 최대치에 육박하여 더 이상 요청을 처리할 수 없어 발생하는 문제. 커넥션 풀 close를 제대로 하지 않는 것으로 보임. HikariDataSource(==ConnectionPool)의 maximumPoolSize 기본값은 10인데, 이를 3으로 변경하고 수행하니 커넥션에 여유가 생겨 pendin..
Oracle Cloud Instance 초기 설정
Oracle Cloud Instance 초기 설정
2021.12.10이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[리팩터링 2판] 3장 Bad Smells in Code
[리팩터링 2판] 3장 Bad Smells in Code
2021.10.14이번 챕터는 언제 리팩터링 해야 하는가? 어떤 코드가 리팩터링이 필요한 코드인가?에 대해서 다룬다. (적어도 나는)코드가 구조적으로 예쁘지 않아서, 보고 있자니 뭔가 마음 한켠이 불편해서, 같은 '느낌'을 감지하고 리팩터링을 하게 되는데 이런 모호한 기준을 끄집어 내서 문장으로 구체화한 챕터이다. 리팩터링이 필요한 코드가 가지고 있는 공통점, bad smell에 대해서 얘기한다. 무엇이 문제인지 알아야, 그에 따른 해결 방안도 떠올릴 수 있다. 부록B에 보면 bad smell case와 해법이 잘 정리되어 있음. 정리하면서 평소 개발하면서 정립했던 나의 개인적인 의견도 같이 적어 두었음. (인용구로 되어 있는 부분) 3.1 기이한 이름 함수든, 변수든, 클래스든 이름만 보고도 각각이 무슨 일을 하고 어떻..
ELK 구축 부터 log 파싱, 적재 까지 (with SpringBoot)
ELK 구축 부터 log 파싱, 적재 까지 (with SpringBoot)
2021.09.11구축 https://github.com/deviantony/docker-elk docker-compose.yml 파일 수정 후 `` docker-compose up -d`` 메모리 세팅 기본 설정에는 JVM Heap이 256m으로 작게 설정되어 있어서 이를 늘려주어야 함. docker-compose.yml 의 `` ES_JAVA_OPTS, LS_JAVA_OPTS`` 설정 (또는 docker 컨테이너 실행 환경 전체에서 제한) 너무 작게 세팅되어 있는 상태로 운영하면 ES나 Logstash 인스턴스가 java.lang.OutOfMemoryError: Java heap space 뜨면서 죽어버릴 수 있음. 그렇다고 너무 넉넉하게 줘서 시스템 전체가 메모리 부족에 시달리면 불필요한 GC, thrashing이 ..
[Thread-safety] 동시성 문제와 shared mutable state 관리
[Thread-safety] 동시성 문제와 shared mutable state 관리
2021.08.30스레드, 컨텍스트 스위칭에 대한 이해 스레드가 수행하는 더 이상 쪼개지지 않는 작업 최소 단위는 CPU instruction 이다. 즉. 어셈블리. interrupt가 들어오면, 지금 하고 있는 인스트럭션 까지 마치고 나서 컨텍스트 스위칭 하게 된다. 스레드 context switching 시, 스레드 컨텍스트(레지스터 등등)가 저장되었다가, 재시작 시 불러와서 이어서 실행하게 된다. e.g., CPU instruction 어디까지 수행했는지는 EIP 레지스터. 직전에 더하려던 값은 EAX 레지스터 등등. 무언가에 1을 더하는 작업을 CPU instruction으로 나누어 보면 최소 아래 3가지로 구성된다. (CAS는 예외) ```assembly load (from mem to reg) add reg, ..