SRP - 단일 책임 원칙단일 책임 원칙은 거의 대다수가 “하나의 컴포넌트는 오로지 한 가지 일만 해야 한다”라고 알고 있다.하지만, SOLID에 S 단일 책임 원칙의 실제 정의는 “컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다”이다. SOLID를 공부하면서 나도 단일 책임 원칙은 하나의 일만 수행해야 한다라고만 알고 있었는데, 해당 책을 읽으면서 컴포넌트를 변경해야 하는 이유가 하나여야 한다는 정의가 좀 더 알맞는다고 생각이 들었다. 변경해야 하는 이유가 하나인 것은 즉, 하나의 일만 수행한다는 것을 의미한다.! 컴포넌트 A는 다른 모든 컴포넌트에 의존하고 있어서 다른 컴포넌트에 변경이 생길 때 같이 변경되어야 한다.컴포넌트 A는 하나의 역할만 수행하는 게 아니라, 여러 역할을 수행하고 있다.여러 ..
Converter란DB에서 어떤 값을 저장할 때 전/후 처리가 필요한 경우가 있습니다.이를 Spring AttributeConverter 인터페이스를 구현하여 처리할 수 있습니다. 사용 예시로, 자바 코드에서는 성과 이름을 따로 관리하고, 데이터베이스에서는 성이름을 그대로 저장하려는 경우 어떻게 처리하는지 보겠습니다. AttributeConverterpublic interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData);}convertToDatabaseColumn : 데이터베이스 컬럼으로 변환해주는 메서드이며, 자바 객체를 어떻게 변..
문제 상황Querydsl을 통해 MySQL에 날짜 함수를 적용하려고 하는데 이슈가 있었다.날짜 함수를 적용하기 위해서는 Expressions.stringTemplate 을 이용하면 원하는 mysql 함수를 적용시킬 수 있다고 생각했다.날짜 연산이 들어간 조건문을 만들어 디버깅을 하는데 해당 조건을 인식할 수 없다고 에러가 발생했다. reasonHibernate에서 아직 INTERVAl 예약어를 지원하지 않는다. QueryDsl 코드는 컴파일 이후 Hibernate로 변경되어 실행되므로, Hibernate에서 지원하지 않는 예약어는 사용할 수 없다!! (Querydsl은 HQL(Hibernate Query Language) 쿼리를 Type-Safe 하게 유지보수해야 할 필요로 탄생했다.) Querydsl ..
일반적인 계층형 아키텍처계층형 아키텍처의 흐름은 간단하게 설명하면웹 계층에서 클라이언트 요청을 받습니다.요청을 받아 도메인 혹은 비즈니스 계층에 있는 서비스로 요청을 전달합니다.서비스 계층에서 필요한 비즈니스 로직을 수행합니다.도메인 엔티티의 현재 상태를 조회하거나 변경하기 위해 영속성 계층의 컴포넌트를 호출합니다.위에서 설명했듯이, 웹에서 도메인 그리고 영속성 방향으로 요청이 흘러감을 알 수 있습니다. 여기서 생기는 문제점이 있습니다. 자연스럽게 웹 계층은 도메인 계층에 의존하게 되고, 도메인 계층은 영속성 계층에 의존하게 되어, 결론적으로 데이터베이스에 의존하게 되는 문제가 발생합니다. 이것이 왜 문제가 되냐면,애플리케이션의 목적은 비즈니스를 관장하는 규칙이나 정책을 반영한 모델을 만들어서 사용자가 ..
If 문은 프로그래밍을 하면서 사용할 수밖에 없는 문법 중 하나이다.If 문을 사용할 때 보다 가독성 좋고 최적화된 코드로 작성하기 위해 If 문 클린 코드 방법에 대해 정리해보고자 합니다.단축 평가자바에서 and와 or 은 &&, || 연산으로 처리합니다.&&if(condition1 && condition2 && condition3 && condition4) {}&& 연산자는 여러 개의 boolean 조건이 있을 때, 하나의 조건이라도 false가 있으면 결과는 false가 됩니다.즉, 위 조건 식에서 condition1이 false이면 뒤에 있는 조건을 확인하지 않고 조건문을 벗어나게 됩니다. ||if(condition1 || condition2 || condition3 || condition4) {..
Git reset & revertreset : 과거의 특정 커밋으로 완전히 되돌린다. (변경 내용 없어짐)revert: 현재에 있으면서, 과거의 특정 커밋들만 없던 일로 만든다. (변경 내용 유지)Git resetgit reset 명령어는 현재 브랜치가 예전의 커밋을 가리키도록 이동시켜 변경 내용을 리셋합니다.reset은 revert와 달리 애초에 커밋하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 작업입니다.추가 설명git reset - -hard a0fvf8 을 통해 B Commit으로 돌아간다.C, D Commit은 없어진다.reset 세부 옵션git reset --soft [commit ID]git reset --mixed [commit ID]git reset --hard [commit ID]gi..
OptionalOptional은 값이 있을 수도 있고 없을 수도 있는 상황을 처리할 때 사용합니다.이를 통해 null을 직접 다루지 않고, 값의 유무를 명시적으로 처리할 수 있습니다.NullPointerException을 방지하면서 코드 가독성을 높일 수 있다. Map()Optional.map() 은 값이 있으면 해당 값을 꺼내와서 코드 블럭을 실행합니다.map() 함수는 간단히 A type을 B type으로 변경하는 역할을 합니다.Optional을 사용하면서 메서드 체이닝을 사용해 처리할 수 있습니다.public String getTeamNameFromDevice(Optional optDevice){ return optDevice .map(Device::getOwner) .map(Use..