전체 글

.
Backend/Java

Stream에 Decorator 패턴 써먹기

"데이터 가공이 필요해요." 공통 기능(엑셀 다운로드)에서 메모리를 절약하기 위해 대용량 데이터를 조회할 경우 마이바티스 `Cursor` 타입을 매개변수로 받도록 설계했다. 여기서 문제를 명확히 하기 위해 커서 데이터가 전부 소비됐으면, 예외를 던져주기로 했다. class ExcelFile { public void write(Cursor cursor) { if (cursor.isConsumed()) throw new IllegalArgumentException("데이터가 없어요."); try (cursor) { // cursor 데이터를 엑셀 파일에 작성하는 로직 } } } 공통 기능을 사용하는 개발자는 커서 데이터 타입을 인자로 넘겨줘야 하는데, 흔히 개발자들이 DB에서 조회된 이 커서 데이터를 인자로..

Backend/Java

공통 lib -> spring-boot-starter로 바꾸기(2)

gradle로 마이그레이션 하기 현재 프로젝트는 maven으로 구성되어있다. 꼭 필요한 작업은 아니지만 maven보다는 gradle을 사용하면 이점이 많기 때문에, gradle로 전환하고 spring-starter 프로젝트로 변환하려 했었다. 마이그레이션 공식문서도 있고 툴도 있어서, 손쉽게 전환할 수 있을지 알았지만 생각보다 많은 삽질이 있었고, 그 과정을 공유해본다. maven 프로젝트 구성 프로젝트는 아래와 같이 구성되어 있다. master 프로젝트가 서브 모듈 worker를 가지는 구조로 하나의 라이브러리 프로젝트를 구성하고 있다. 그리고 이 라이브러리 프로젝트를 사용하는 별도의 빌드 프로세스를 가지는 외부 프로젝트가 있다. 멀티모듈 프로젝트1(라이브러리) -> master-worker 외부 프로..

Tools

Gradle 겉 핥기

왜 maven을 두고 gradle을 배워야 할까? Gradle는 주로 Java 프로젝트에 사용되는 강력한 빌드 자동화 도구다. 소스 코드 컴파일, 테스트 실행, 애플리케이션 패키징 및 배포 과정을 자동화한다. 정의부터 살펴보면 어플리케이션을 배포하기 위해 개발자들이 했던 작업들을 자동화해 주는 툴이다. 이전에는 개발자들이 터미널에서 명령어로 한땀한땀했던 일련의 반복적인 작업들을 빌드 툴이 자동으로 컴파일해주고 테스트코드를 실행시켜 주고 참조하는 라이브러리 파일을 관리해주는 것이다. // 컴파일 후 테스트 // 빌드툴 X $ javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/Te..

Backend/Java

공통 lib -> spring-boot-starter로 바꾸기(1)

웹기반 공통 Library 중복되는 설정들 혹은 공통으로 관리해야 할모듈을 한 곳에서 관리하는 것은 흔한 일이다. 현재 내가 진행하고 있는 프로젝트 또한 모든 프로젝트에서 참조하는 스프링 웹 기반의 라이브러리 프로젝트가 존재하고, 여기에는 많은 스프링 Bean이 존재하고 있다. 처음에는 문제를 느끼지 못했지만, 시간이 갈수록 웹 환경에 의존적인 많은 Bean들이 다른 클라이언트 프로젝트에 맞지 않는 경우가 생겨났고, 설계가 잘못됐다고 확실히 느낄 수 있었다. 어디서부터 잘못된 걸까? 외부 jar에 정의된 스프링 Bean은 읽지 않는 것이 기본 원칙이다. 제일 헷갈린 부분이다. 내가 현업에서 사용하는 프로젝트는 외부 jar에 정의된 Bean들이 클라이언트 프로젝트 Context에서 등록돼 잘 사용하고 있다..

일상

2022 회고록

만족스럽지 못한 하루를 보내면, 아쉬운 마음에 하루를 마무리하지 못하고 늦게 잠들게 된다고 한다. 미루고 미루다 2023년 1월이 다 가고 나서야 2022년을 마무리하는 것은 그런 이유일까. 돌이켜보면 아쉬움이 많은 한 해였다. 성장할 수 있을까? 계약 종료, 퇴사 등 여러 이유로 인원이 부족해지면서 팀 내에서 내가 담당해야 하는 일이 점차 많아졌다. 일이 많아져도 배움이 있고 성장이 있으면 된다는 주의라 크게 불만은 없었다. 하지만 문제는 거기에 있었다. 시간이 갈수록 내가 성장하고 있는 건지 모르겠다는 생각이 들었기 때문이다. 작년 여름쯤, 서비스기업 코딩테스트를 본 적이 있다. 알고리즘 문제 외에도 서술형 문제가 5개 정도 있었다. 문제상황을 주고 어떻게 해결할 건지 문제해결능력을 보는 것이었는데,..

Backend/Java

Session은 Controller까지만

서론 길었던 프로젝트 막바지로 달려가면서, 아쉬운 점이 눈에 계속 밟힌다. 아무것도 모르고 시키는 것만 하던 신입시절을 지나서, 이제 어느 정도 업무에 익숙해지니 "이렇게 하면 좀 더 좋지 않았을까?" 생각이 들거나 "이렇게 했었어야 했는데..."하고 아쉬움이 드는 몇 가지를 나누어 정리하려 한다. 물론 고작 주니어 개발자의 생각이기 때문에 이 글엔 틀린 점이 많을 수도 있다. 글 제목에서도 보이듯이, 이 글은 Session은 Controller에서만 사용하자는 것이다. 대부분의 기업에서는 아마 당연하게 하고있는 것들이겠지만, 아쉽게도 내가 참가한 프로젝트에서는 그러지 못했다. Service 영역에는 비즈니스로직과 관련된 것만 있어야 한다. 표현 계층에 의존해서는 안된다. 본론 Service 영역에서 S..

Backend/Java

Spring Boot 2.4.x 이슈

서론 이번에 진행하고 있는 프로젝트에서 전자정부 4.0과 버전을 맞추기 위해 SpringBoot 2.4.5 버전으로 업그레이드 했다. 프로퍼티 작성법이 변경되는 것말고는 크게 이슈가 없을 줄 알았는데, 몇가지 자잘한 문제들이 생겼다. 몰랐던 내용도 있고 해서 글로 정리해본다. 1. Default Servlet Registration Spring Boot 2.4 will no longer register the DefaultServlet provided by your servlet container. In most applications, it isn’t used since the Spring MVC’s DispatcherServlet is the only servlet that’s required. Yo..

일상

2021 회고록

부끄럽지만 새해를 시작하며 지난 한 해를 돌이켜본다. 내게 2021년 가장 큰 키워드는 아무래도 취업이 아닐까 싶다. 취업하면서 많은 것이 변했다. 부산에서 서울로 상경하면서 새로운 사람들, 새로운 자취방, 새로운 환경, 겪고 싶지 않은 출근길 지하철까지... SI로 취업 내가 원하는 방향은 아니었지만 SI로 취업에 성공했다. 인터넷에서 이미 안 좋은 소문은 들을 대로 듣고 가서 그런가, 생각보다 만족스러웠다. 물론 서비스 기업과 기술과 문화가 많이 다르지만, 배울 게 없는 건 아니라고 생각한다. 내가 모르는 게 많은 것도 있겠지만 시스템 공통 부문 신입으로 입사했는데, 주요 업무가 애플리케이션 개발 환경을 구성하고 개발자들을 지원하는 일이었다. 배울 수 있는 건 많지만, 아무래도 내 업무가 다른 개발자..

비비빅B
어제의 최선