일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 인프콘2023
- 2024회고
- JPA
- 직장인 회고
- modelmapper
- 공룡책
- Junit 5
- 갓생
- softeer
- enumSet
- Test code
- 일상
- 소프티어
- Service 계층 테스트
- Spring
- 2025 계획
- FCM
- ExceptionResolver
- Java
- 자바
- Server
- Coputer Science
- mapstruct
- OS
- 테크쇼
- Test Doulbe
- db
- MySQL
- Test
- proxyFactory
- Today
- Total
목록전체 글 (62)
공부내용공유
서론 3개월간의 온보딩 프로젝트가 끝났다. 처음 해 본 온보딩 이었지만 정말 온보딩스러운 온보딩 프로젝트였다고 생각한다! (좋은쪽으로) 프로젝트가 끝난겸 기억나는 것에 대해 주저리 주저리 쓸 예정이다. 본론 무엇을 했었나 자세히 얘기할 수는 없지만 사용자들의 정책(?)들을 저장하고 해당 정책들을 활용해 다양한 로직을 수행하는 서버를 만드는 프로젝트였다. 기술 스택은 Java 17, Spring boot 2.7 , MongoDB 를 사용하였고 프로젝트를 진행하면서 중점으로 다룬 것은 생소한 NoSQL인 MongoDB 를 잘 활용하는 것 (schema 설계, index 설계 등등...) , 팀 컨벤션에 맞춘 개발, 소프트 스킬 등이었다. 2~3주 간의 필요 기술 공부, 기획서 분석, 스키마 설계등을 하였고 ..
서론 지금 진행중인 프로젝트에서 어떤 기능이 실패했을 때 로그성 정보를 DB에 저장하는 기능을 추가해야했다. 처음에 아무 생각없이 다른 service 계층에서 저장 로직을 가지고와 사용했는데 이러한 리뷰를 받았다. 로그 저장은 해당 기능의 주 관심사는 아닌거 같아요! event,aop,interceptor와 같은 기능을 사용해서 주 관심사와 부 관심사를 분리하는게 어떨까요? 완전 맞는 말이었고 해당 기능을 event를 통해 분리하였다. 사실 event라는 개념을 처음 사용해봐서 검색을 하고 비슷한 방식으로 적용하였는데 그렇게 사용하는 것은 event의 본질을 살리지 못했다 라는 리뷰를 받았고 event에 대해 제대로 공부하게 되었다. 이 글에서는 코드의 변화 과정을 기반으로 spring event의 올바..

서론 REST API 서버를 만들면 controller의 request DTO를 한 개쯤은 만들게 되고 편한 사용을 위해 여러 어노테이션을 사용하게된다. 지금까지 “RequestBody가 DTO로 맵핑될 때 그냥 대충 기본 생성자랑 리플렉션 사용해서 만들어진다“ 정도로만 알고 있었다.. 코드 리뷰를 받다가 해당 부분 관련해서 질문을 받았는데 대답을 하지 못했고 굉장히 부끄러웠다.. 수치심을 지식으로 바꿔보자. 본론 리뷰를 받았던 코드를 임의의 예시로 구현하였다. @Getter @Builder public class request { private final String name; private final int age; private final List options; } 리뷰어님 : 어 @NoArgsC..

서론 FCM 기능을 완성하고 로컬에서 프론트 담담 팀원과 함께 테스트까지 완료하여 deploy 브랜치에 올렸다. 그런데 도커 컨테이너가 꺼져버렸다……. 컨테이너의 상태를 보니 exited(1) 이 떠있었고 log를 통해 확인해 보니 FCM을 사용하기 위한 key를 읽을 수 없다는 log가 찍혀있었다. 어떤 것이 문제였고 어떻게 해결했는지를 정리하고 공유하기 위해 이 글을 작성하였다. 본론 문제가 발생한 부분 FCM 기능을 사용하기 위해서 FCM Service Key가 resources 파일에 있고 @Value 를 통해 resource로 가져와 FirebaseMessaging Bean을 만드는 구조였다. @PostConstruct를 사용한 Bean 생성 코드 일부 로컬에서 돌릴 때는 아무런 문제가 없어서 ..

서론 지금 진행중인 프로젝트에서 강의가 등록되었을때, 매니저가 공지사항을 등록했을때, 강의에 선정되었을때 등등 메인 비즈니스 로직에 알람기능은 필수이다. 원래 알람 기능을 맡았던 팀원과 프론트분과 기능을 구현하면서 어려움을 겪고 조금 진행이 늦어지고 있었는데 알람을 담당하던 팀원이 개인 사정으로 인해 프로젝트에서 하차하게 되었고 나와 다른 팀원 1명이서 임시방편으로 기능이 작동하게 고치고 베타 테스팅을 진행하였다. 그 후 FCM 도메인 공부 및 레퍼런스를 찾아보고 기능 수정, 추가 및 리팩토링이 필요하다고 판단을 내렸고 해당 issue 를 내가 담당하게 되었다. 도메인 공부 및 리팩토링을 하면서 고민했던것들, 작성한 코드등을 정리하기 위해 이 글을 작성하였다. 본론 일단 기능 수정 및 리팩토링에 앞서 현..

서론 스프링 Proxy를 공부하면서 Proxy Factory 에 대해 알게되었다. Proxy Factory는 interface 를 구현하고 있는 class 의 경우에는 JDK 동적 프록시를 사용해서, interface 를 구현하고 있지 않은 경우에는 CGLIB 를 사용해서 프록시를 만들어 주는 식으로 동작한다. Proxy Factory 가 어떻게 이를 구분하고 어떤식으로 proxy 객체를 만드는지 궁금해서 코드를 직접 보면서 간단하게 정리하였다. 본론 프록시 팩토리를 생성하고 해당 팩토리에서 프록시를 가져오는 코드를 먼저 살펴보면 프록시 대상으로 삼을 클래스를 정해준다. ProxyFactory 생성자에 해당 클래스를 넣어서 proxyFactory 를 생성한다. 해당 Factory 에 사용하고 싶은 프록시..

서론 처음에 프로젝트를 시작할때는 예외처리에 대해 깊게 고민하지 않고 비즈니스상 발생하는 Custom Exception 만 만들고 던지면 충분하겠지 라고 생각을했다. 그러나 실제 프로젝트를 진행하면서 client 개발자분은 다른 예외들을 더 많이 마주쳤고 해당 예외에 대해서는 별도의 처리가 안돼있어서 어디서 잘못된건지 알아볼 수 없는 형태였다. 예외가 터질때마다 연락을 하여 물어보는 비효율적인 방식을 개선하기 위해 위해 예외처리에 대해 알아보고 프로젝트에 적용을 하고 어떻게 더 개선할 수 있을까에 대한 고민을 글로 작성하였다. 본론 프로젝트를 진행하면서 client 개발자 분이 가장 자주 마주치는 Exception 들은 MethodArgumentNotValidException HttpMessageConv..
서론 인프콘 2023 에 당첨되어 인프콘에 갔다왔다! 세션도 정말 재미있었고 경품들도 잔뜩 받았다. 나중에 볼 수 있게 들었던 세션들에서 기억나는 내용과 후기를 간단히 남겨 본다. 본론 듣고 싶은 세션들은 정말 많았지만 시간대별로 1 세션만 고를 수 있어서 들어가기 직전까지도 고민을 많이 하였다. 소프트웨어 설계를 위한 추상적, 구조적 사고 변별력을 200% 더 높인 개발자 채용 방법: 코드 리뷰 테스트 어느날 고민 많은 주니어 개발자가 찾아왔다 2탄: 주니어 시절 성장과 고민들 점진적 추상화 스프링과 함께 더 나은 개발자 되기 이렇게 5개의 세션들을 너무 재밌게 들었다. 각 세션별로 기억나는 내용, 후기들이다. 소프트웨어 설계를 위한 추상적, 구조적 사고 초반 내용에서 발표자분이 말하셨던 내용 중 기억..

서론 현재 진행중인 프로젝트에서는 JWT 토큰으로 인가를 사용하고 있고 Access Token 과 Refresh Token으로 보안을 조금 더 강화시켰다. 로그인 파트를 내가 구현하지는 않아서 처음에는 신경쓰지 않고 있다가 프로젝트 베타 테스트를 하면서 문득 Refresh Token 만으로 보안이 충분한가? 라는 생각이 들었고 여러 자료들을 보고 정리하면서 내 나름의 결론을 내리고 프로젝트 고도화를 할 때 팀원들과 상의할 예정이다. 본론 현재 프로젝트에서는 사용자가 로그인을 하면 Access Token 과 Refresh Token을 만들어 보내주고 클라이언트에서는 Async Storage 에 저장을 하는 형태이다. public String createAccessToken(String account, lo..

서론 자바로 알고리즘 문제를 풀면서 Integer , String 을 HashMap 자료구조를 사용하여 해결해야 하는 문제를 풀고 있었다. 이때 디버깅 및 간단한 실험을 위해 Integer 끼리 동등 연산자를 사용하여 비교하는 코드를 돌렸다. 내가 공부했던 wrapper class 는 Inerger a = 100 은 new Integer(100); Integer b = 100 또한 new Inteher(100); 이므로 a==b 는 false 가 나올거라 생각했는데 True 가 나왔다. 왜 그럴까를 찾아보고 알게된 사실을 정리하였다. 본론 Integer class 를 스르륵 훓어 봤는데 수상한걸 발견했다. 해당 부분의 코드를 보고 검색을 해본 결과. Integer class 는 -128 부터 128 까지..