전체 글
[Spring] MVC Layered Architecture : DTO와 Domain Model을 분리해야 하는 이유
[Spring] MVC Layered Architecture : DTO와 Domain Model을 분리해야 하는 이유
2022.03.14God Class에 대한 용어 정리 god class는, 꼭 크기가 커야만(가지고 있는 필드가 많아야만) god class인 것은 아닙니다. 여러 layer에 걸쳐 사용되고 있다면, 또는 2개 이상의 책임을 가지고 있다면, 그 클래스를 사용(의존)하고 있는 클래스가 그 만큼 많다는 의미이고, 이는 곧 god class (또는 god class 유망주)입니다. god class는 크게 2가지 유형으로 나누어 볼 수 있습니다. (왼쪽) domain 책임은 제대로 나눴으나 여러 layer에 걸쳐 사용되는 경우 = 유형 1 (오른쪽) domain 책임을 제대로 나누지 못해 1개 이상의 책임을 가지는 경우 = 유형 2 유형 1 + 유형 2 = 유형3 이 글에서 주요하게 다루고자 하는 내용은 유형 1 God Cla..
[마틴파울러] Layering 관련 글 모음
[마틴파울러] Layering 관련 글 모음
2022.03.13https://martinfowler.com/bliki/PresentationDomainDataLayering.html layer를 나누는 것의 장점 1. 관심 분리 (를 통해 작업 대상 layer에 집중 가능) 마틴 파울러는 layer를 나누는 것의 최고 장점은, 작업 대상이 되는 layer에만 집중할 수 있도록 해준다는 점이라고 얘기하고 있다. It's biggest advantage (for me) is that it allows me to reduce the scope of my attention by allowing me to think about the three topics relatively independently. When I'm working on domain logic code I ..
[MyBatis] 객체 안의 객체 매핑하기 (ResultMap과 DTO)
[MyBatis] 객체 안의 객체 매핑하기 (ResultMap과 DTO)
2022.03.12객체 안의 객체 매핑하기 https://mybatis.org/mybatis-3/ko/sqlmap-xml.html# - 복잡한 결과매핑 섹션 부터 참조. 읽어 보면 알겠지만, 연관(Association)을 위한 중첩된 Select 는 N+1 Selects problem으로 인해 추천하지 않는다. `` LEFT OUTER JOIN``을 활용한 관계를 위한 내포된 결과(Nested Results) 방법을 사용하는 것을 권장하고 있다 DTO를 사용하면 굳이 객체 안의 객체 매핑 할 필요 없이, DTO에서 flatten해서 받아도 된다. 어차피 쿼리는 `` LEFT OUTER JOIN``을 사용한다면 컬럼을 flatten 해서 가져오게 된다. 따라서 [`` ResultMap - DTO - Model``] 변환의 ..
Domain Model에 대해서
Domain Model에 대해서
2022.03.11Domain Model이란 해당 도메인에서 비즈니스적인 의미를 가지는 object 다. An object model of the domain that incorporates both behavior and data. - P of EAA Domain Model은 id 여부에 따라 두 가지로 구분할 수 있다. Entity id가 있어 각각의 개체를 고유하게 식별 할 수 있는 경우 엄밀히 불변은 아니고 시간이 지나면서 상태가 변경될 수 있는 대상임. (그러나 이와 별개로 앱단에서는 불변 객체로 처리하는 것이 좋다. 함수형.) e.g., Member VO ( value object ) id가 없음 To avoid aliasing bugs I follow a simple but important rule: val..
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..
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC 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..