전체 글196 8장. OCP: 개방 - 폐쇄 원칙 개방 - 폐쇄 원칙 소프트웨어 개체는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 즉, 소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 이때 개체를 변경해서는 안된다. 사고 실험 보고서를 웹 페이지로 표시하는 프로그램에, 보고서를 프린트하는 기능을 추가한다고 해보자. 소프트웨어 아키텍처가 훌륭하다면 기존 코드의 수정량은 거의 없을 것이다. 서로 다른 목적으로 변경되는 요소를 적절히 분리(SRP)하고, 이들 요소 사이의 의존성을 체계화(DIP)하면 변경량의 최소화가 가능하다. 단일 책임 원칙에 따라 위의 과정을 책임으로 나눠보자. 주어진 데이터를 분석하고 계산한다. 계산된 데이터로 웹 페이지용 보고서를 만들거나, 프린트용 보고서를 만든다. 우리는 보고서 생성이라는 하나의 과정이 두 개의 책.. 2023. 11. 21. [11/20 TIS] git push가 먹통이 된 날 평화롭게 TDD 프로젝트를 진행하던 어느 날... 갑자기 git push가 거절당했다. 처음 등장한 에러 로그는 아래와 같다. 힌트를 보니 remote에 내가 한 일이 포함되어 있단다. 내가 뭘 했을까... 하고 커밋 내역을 살펴봤다. 충격적인 결과였다. 뭔 README 업데이트를 해버렸구나 내가... 어리석게도 혼자서 진행하는 프로젝트다보니 main브랜치에 모든 진행 과정을 박고 있었고, 당연히 README도 메인에서 바로 수정해서 업데이트 해놨다. 여기서 문제가 발생했다. 원격 저장소에는 README가 수정되어있다. 로컬 저장소에는 이러한 사실이 반영되지 않았다. 아니 애초에 로컬 저장소에 README가 있었나? 일단 원격 저장소를 pull 받아와 README파일을 로컬에 저장했다. 이후 READM.. 2023. 11. 20. Pull Request 012 - 자유 게시글 등록 기능 컨트롤러 계층 TDD로 구현하기 이번에는 컨트롤러에 대한 테스트를 작성하고 기능을 구현해보려 한다. 앞서 Service계층의 상위 기능의 테스트를 작성하겠다고 했는데, 다시 생각해도 이미 완성된 테스트와 기능을 가져다 쓰기만 하는데 굳이 테스트가 필요할까 싶어서 만들지 않았다. 아무튼 컨트롤러 계층의 테스트 작성을 시작해보자. 컨트롤러 계층의 테스트를 하기에 앞서 우리는 한 가지 선택을 해야한다. @SpringBootTest를 사용할 것인가, @WebMvcTest를 사용할 것인가. 둘의 차이는 여러 글들을 통해 확인할 수 있으니 확인해보길 바란다. 참고 할만한 글들을 하단에 링크로 남긴다. 아주 간단히 요약하자면, 통합 테스트를 진행하고 싶으면 @SpringBootTest를 사용하는 것이, 단위 테스트를 진행하고 싶으면 @WebMvcT.. 2023. 11. 20. 5장. 형식 맞추기 형식을 맞춘 코드를 작성하자. 간단한 규칙을 정하고 규칙을 착실히 따르도록 하자. 팀 단위라면 팀이 합의해 규칙을 정하고 모두가 따라야 한다. 형식을 맞추는 목적 코드 형식은 소통의 일환이다. 그리고 소통은 개발자의 일차적인 의무다. 오늘 구현한 기능은 다음 버전에서 높은 확률로 변경된다. 그러나 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드 품질에 지대한 영향을 미친다. 코드는 바뀌기 마련이다. 기존 기능이 수정 / 삭제되기도 하고, 새로운 기능이 추가되기도 한다. 그러나 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 변하지 않는다. 작성한 코드의 유지보수 용이성과 확장성에 계속해서 영향을 미친다. 적절한 행 길이를 유지하라. 어떤 거대한 프로젝트도 대부분 200줄 정도의 파일들로 구성할 수 있다. 특.. 2023. 11. 20. public 함수와 private 함수의 배치 위치 이전까지 클래스에 함수들을 정의할 때, 나는 public함수를 무조건 private함수보다 위에 위치시켰다. 이유는 다음과 같다. public 함수는 공개된 API이다. 즉, 각 클래스가 담당하는 핵심 기능이다. 이런 핵심 기능들은 코드를 읽는 사람들에게 먼저 공개해야 한다. 따라서 소스파일의 상단에 위치시켜 코드를 읽는 사람들이 해당 클래스의 기능을 빠르게 파악할 수 있게 한다. 이렇게 배치시켰을 때 장점은 확실했다. 소스파일을 읽을 때 크게 고민할 필요가 없었다. 내가 이 클래스를 왜 만들었는지를 쉽게 보여줄 수 있었다. 문제는 오류가 발생하거나, 리팩터링을 할 때 나타났다. 하나의 public 함수는 세부 구현을 많은 private함수에게 넘긴다. 다시 말하면, 오류가 어디서 발생했는지를 보려면 .. 2023. 11. 20. 07. 고급 매핑 이번 매핑 전략에서는 책의 예시를 그대로 사용한다. 내 프로젝트에 적용해보려 했는데, 적절히 적용할만한 부분을 찾지 못했다. 2023.11.27 프로젝트에 적용했다! 링크에서 확인할 수 있다. 모든 코드는 링크에서 확인할 수 있다. 상속 관계 매핑 - 조인 전략 조인 전략은 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 복합 키로 사용하는 전략이다. 위의 예시에서는 ITEM, ALBUM, MOVIE, BOOK 테이블을 모두 만든다. 부모 키를 받아 기본 키로 사용하기 때문에 조회 시 조인 방식을 사용한다. 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없다. 따라서 타입을 구분하는 칼럼을 추가해야 한다. 부모 클래스에 @Inheritance(strategy=.. 2023. 11. 13. 이전 1 ··· 8 9 10 11 12 13 14 ··· 33 다음 반응형