본문 바로가기

분류 전체보기

(126)
[Clean Code] 2장 - 의미 있는 이름 의도를 분명히 밝혀라 좋은 이름을 지으려면 시간이 걸리지만, 좋은 이름으로 절약하는 시간이 훨씬 더 많다. 의도가 들어나는 이름은 코드 이해화 변경이 쉬워진다. 변수, 함수, 클래스 이름은 다음과 같은 질문에 답할 수 있어야 한다. 존재의 이유는? 수행 기능은? 사용 방법은? 따로 주석이 필요하면 의도를 분명히 드러내지 못했다는 말이다. Example // Bad public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) { if (x[0] == 4) { list1.add(x); } } return list1; } 위의 예시는 함축성이 부족하다. 코드 맥락이 코드 자체에 명시적으로 드러나지 않는다. // Good public..
[Clean Code] 1장 - 깨끗한 코드 [Clean Code]를 읽으면서 정리하는 노트 📝 코드가 존재하리라 코드는 요구사항을 상세히 표현하는 수단이다. 앞으로 프로그래밍 언어에서의 추상화 수준은 점점 높아지며, 특정 분야에 적합한 언어도 다양해질 것이다. 나쁜 코드 우리 모두는 자신이 짠 쓰레기 코드를 쳐다보며 나중에 손보겠다고 생각한 경험이 있다. 우리 모두는 대충 짠 프로그램이 돌아간다는 사실에 안도감을 느끼며 그래도 안 돌아가는 프로그램보다 돌아가는 쓰레기가 좋다고 스스로를 위로한 경험이 있다. 다시 돌아와 나중에 정리하겠다고 다짐했었다. 물론 그때 그 시절 우리는 리브랑의 법칙을 몰랐다. 나중은 결코 오지 않는다. 나쁜 코드로 치르는 대가 코드가 엉망이라 프로젝트 진도가 안나간다. 즉 개발 속도를 떨어뜨린다. 코드를 고칠 때마다 엉뚱..
@PostConstruct와 @PreDestroy Spring에서는 빈의 생성과 소멸을 어노테이션으로 관리할 수 있다. @PostConstruct Spring은 빈 초기화 직후에 @PostConstruct이 달린 메서드를 한 번만 호출한다. 만약 초기화할 것들이 없는 경우에도 해당 메서드는 실행이 된다. @PostConstruct가 달린 메서드는 모든 접근 제어자를 가질 수 있지만 static 메서드일 수는 없다. Example 애플리케이션 구동 시 더미 데이터가 필요한 경우 - (근로) 해당 더미 관련 Service에서 관련 Repository 빈 초기화가 이루어진 후 @PostConstruct가 붙은 메서드가 실행되면서 더미데이터를 넣을 수 있다. 사실 이 전에 더미데이터 넣는 방법을 무조건 ApplicationRunner를 구현한 DataLoade..
Logback과 로깅 전략 Logback 이란? 자바 오픈소스 로깅 프레임워크, SLF4J의 구현체 log4j, log4j2 등과 성능을 비교했을 때에도 logback이 더 훌륭한 성능 (괸련 링크) spring-boot-starter-web 안에 spring-boot-starter-logging에 구현체 존재 Spring Boot의 경우 logback-spring.xml 파일을 resources 디렉토리에 만들어서 참조 Logback의 참고 순서 classpath(resources디렉토리 밑)에 logback-spring.xml파일이 있으면 설정파일을 읽음 logback-spring.xml파일이 없다면 .yml(.properties)파일의 설정을 읽음 logback-spring.xml파일과 .yml(.properties)파일이 ..
Flyway 적용기 2021-07-21 작성 Flyway란? 오픈 소스 데이터베이스 마이그레이션 도구 버전별 DB 스크립트 파일을 열거 해 두면 알아서 SQL 파일을 수행해 주고 DB 변경 이력에 대한 관리를 해 주는 녀석 Flyway와 JPA spring.jpa.hibernate.ddl-auto create, update, create-drop 은 prod 환경에서 절대 비추 validate Entity 와 테이블의 정합성이 맞는지 검증한다. (안맞으면 오류를 냄) 배포 환경에서는 validate 옵션으로 테이블이 변경될 시 애플리케이션을 가동시키지 않고 수동으로 테이블 변경사항을 맞추어야 한다. 현재 우리는 DEV, PROD 두 개의 환경에서 MariaDB를 사용하고 있다. 엔티티가 변경될 때마다 해당 변경 사항을 일일..
CI/CD란, 젠킨스 실습해보기 2021-07-11글 CI (Continuous Integration) 지속적 통합 개발하면서 코드에 대한 통합을 지속적으로 진행 여러 개발자가 작성하거나 수정한 소스를 지속적으로 통합하고 테스트 빌드 및 테스트 자동화 CI를 적용할 때의 흐름 개발자는 자신이 개발한 소프트웨어의 소스코드를 공통된 버전 관리시스템(github 등)에 저장. 소스코드상에 변동이 생기면 버전 관리 시스템에서는 CI 툴로 소스코드 변경 알림 CI툴에서는 변경된 소스코드를 대상으로 Build, Test, Merge를 진행 이 과정들이 완료되면 슬랙, 카카오톡, 메일 등을 통해 통합 결과를 알림 CD (Continuous Delivery, Continuous Deployment) 지속적 배포 애플리케이션이 항상 신뢰 가능한 수준에..
[ERROR] Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 이 문제를 어떻게 겪게 되었나면.... UT를 진행 중, SQL 인젝션을 테스트 해 본다고 구구가 닉네임 입력 자리에 `where id = `를 그대로 입력했는데 바로 에러가 터지고 말았다. 닉네임을 입력하면 바로 입력한 닉네임이 중복디 되지는 않았는지 검증하는 API에게 요청을 보내는데, 여기서 예외가 발생한 것이다. 우리는 '여기서 SQL 인젝션 공격이 먹혀서 에러가 터졌나?' 의문을 품고 있었지만, 구구는 스프링 부트에서는 이미 SQL 인젝션 공격을 막고 있다고 하셨는데 여기서만 터지는게 이상하다고 하셨다. UT를 마치고 우리는 이 에러가 왜 터졌을까 고민하다가 고민하다 에러 로그를 하나씩 살펴보기 시작했다. 일단 먼저 네트워크 탭에서 해당 API의 응답이 우리가 정의해준 예외가 아닌 애초에 OPT..
ApplicationEventPublisher 적용과 그 안에서의 삽질 ApplicationEventPublisher 이벤트 핸들러는 이벤트 생성 주체가 발생한 이벤트에 반응하고, 이벤트 핸들러는 생성 주체가 발행한 이벤트를 전달받아 이벤트에 담긴 정보(데이터)를 기반으로 해당 기능을 수행 놀토에서 ApplicationEventPublisher 우리는 사용자에게 어떤 특수한 이벤트가 발생했을 때 Event 테이블에 해당 이벤트 정보를 저장하여야 한다. ex) 자신의 피드에 댓글이 달렸을 때, 자신의 피드에 좋아요가 눌렸을 때 이제부터 우리 알림 기능을 ApplicationEventPublisher로 구현해야하는 이유를, 이를 사용하지 않을 시 문제점을 보며 나열해본다. ApplicationEventPublisher를 쓰지 않았을 때의 문제 기존 로직에 결합도가 높아진다 현재..