Backend/Java

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..

Backend/Java

UUID, 정말 안전할까?

서론 파일을 서버에 보관할 때, 파일명 변환하는 걸 java UUID를 사용해서 변환했었다. 코드 리뷰를 받던 중에 선임분이 UUID에 대한 의심을 보이셨다. 하나의 OS에 여러 앱이 가동되는 환경, 그리고 멀티스레드에서도 충돌 가능성이 없나? 단순하게 그냥 유니크한 값이라고 믿고 사용해왔던 터라 대답하지 못했다. 이번 기회에 UUID가 어떻게 유니크한 값을 생성하는지 알아보고 정리해보려 한다. 본론 고유성을 완벽하게 보장하려면 중앙관리시스템이 있어서 일련번호를 부여해 주면 간단하지만 동시다발적이고 독립적으로 개발되고 있는 시스템들의 경우 중앙관리시스템은 불가능하다. 개발주체가 스스로 이름을 짓도록 하되 고유성을 충족할 수 있는 방법이 필요하다. 이를 위하여 탄생한 것이 범용고유식별자(UUID)이며 국제..

Backend/Java

Tika로 파일 MIME 타입 검사

서론 최근에 코로나 밀접접촉자 판정을 받으면서 약 일주일 동안 재택근무했다. 좋긴 좋은데 집에서 하니 뭔가 집중도 안되고 카페를 못 가니 답답했다. 암튼, 소스코드 외부 반출이 안돼서 집에 있는 동안 확장자 체크 라이브러리 tika 좀 알아보라는 업무를 받았다. 업무를 하면서 알게된 내용을 정리해보려 한다. 본론 MIME(Multipurpose Internet Mail Extensions) tika는 MIME를 이용해서 파일 타입을 체크한다. MIME이 뭘까? MIME는 SMTP 프로토콜에서 이메일을 보낼때 파일을 확인하기 위해 생성된 표준인데, 이제는 많은 프로토콜에서 같은 목적으로 MIME를 사용하기 시작했다. 그래서 "Internet Media Type"이라고 부르기도 한다. 대부분의 프로토콜에서 ..

Backend/Java

YAML) @PropertySource에서 EnvironmentPostProcessor까지

서론 application.yml은 yaml 사용하는데, 왜 @PropertySource는 properties를 사용하나요? 시작은 이렇다. 프로젝트 내에서 업무 외적인 환경변수는 application.yml에, 업무 내적인 환경변수는 별도의 @PropertySource로 biz.properties를 사용하는 구조였다. 그래서 아무래도 가독성이 좋은 yaml로 통일하는 게 좋은 것 같은데, property를 사용하는 특별한 이유가 있냐고 물어봤었다. 특별한 이유는 없었고 yaml을 쓰려면 추가적으로 설정해줘야 하는 게 있는데 그걸 한번 알아보라는 업무를 받았다.😂 property로 했던 기능들을 yaml로 별 이상 없이 쓸 수 있으면 yaml로 통일하자고 하셨다. 단순히 그냥 확장자만 바꾸면 될 줄 알았..

Backend/Java

SpringBoot profile logback

서론 스프링 부트 환경에서 profile별로 로깅 방식과 레벨을 설정해야 했다. 이전에 쓰던 프로젝트의 logback.xml 소스를 받아 그대로 사용해도 됐지만, logback.xml에서 profile마다 로그 레벨과 appender를 지정하는 게 내 눈에는 복잡해 보였고 좀 더 좋은 방법이 없을까 찾아보게 되었다. SpringBoot Logback spring-boot-starter에는 기본적으로 slf4j 인터페이스를 구현한 logback을 사용한다. 사용자는 slf4j를 인터페이스를 사용하는 덕분에, log 구현 라이브러리를 손쉽게 교체할 수 있다. log4j, logback, log4j2가 있고 후자일수록 성능이 더 좋다고 하지만 스프링 부트가 기본적으로 사용하는 logback을 사용하기로 했다...

Backend/Java

Java Stream과 Multi Thread

서론 코딩 테스트를 했을 때, Stream을 사용했는데 사용한 이유에 대해서 면접관이 물어본 적이 있다. 나는 대충 "사람의 언어에 가까운 함수형 프로그래밍으로 가독성이 좋다" 이런 식으로 대답했었다. 면접관은 원하는 대답이 아니었는지, 멀티스레드 환경에서 Stream 장점을 설명해보라 했는데 자세히 알지 못해서 그냥 "하드웨어와 애플리케이션이 멀티스레드 환경이라면 병렬 처리를 지원해줘서 더 좋다"라고 대답했었다. 그러고는 질문이 끊겼는데... 좋은 인상을 준 건 아닌 느낌😰 이번 기회에 Stream과 멀티스레드가 무슨 관계가 있는지 좀 더 자세히 알아보려 한다. Stream 탄생 이유 Collection을 가공하고 처리하는 Java8 API다. 기존의 Collection으로도 요구사항을 다 처리할 수 ..

Backend/Java

JDBC query vs queryForObject

서론 Spring JDBC를 연습하던 중에 단일 행을 조회하는 데 query를 사용하는 예시를 봤다. query는 List 객체를 반환해 굳이 단일 행을 조회하는 데 query를 쓸 필요가 있나? 하고 queryForObject를 써서 바로 단일 객체로 받아왔다. 정상적으로 작동했고 나름 뿌듯해하면서 예외상황에 대한 테스트 코드를 작성했다. 서비스에서 email를 찾지 못할 시 NotFoundException(404)를 던지게 코드를 작성했다. @Transactional public User login(Email email, String password) { checkNotNull(password, "password must be provided."); User user = findByEmail(emai..

비비빅B
'Backend/Java' 카테고리의 글 목록 (2 Page)