일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- FCM
- Test
- OS
- modelmapper
- JPA
- Service 계층 테스트
- Junit 5
- mapstruct
- Spring
- ExceptionResolver
- 갓생
- 일상
- Test code
- 소프티어
- enumSet
- 2025 계획
- softeer
- proxyFactory
- 공룡책
- 2024회고
- Server
- Java
- 직장인 회고
- Coputer Science
- MySQL
- 자바
- 테크쇼
- 인프콘2023
- db
- Test Doulbe
- Today
- Total
목록분류 전체보기 (60)
공부내용공유
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cdmgBa/btsC2y0AnWo/sI8uKR3BTKrkWrnMQXvOEk/img.png)
서론 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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dA8YIO/btsw7xTRVYv/F4JPBOyApjA0kfvC4RRmwK/img.png)
서론 FCM 기능을 완성하고 로컬에서 프론트 담담 팀원과 함께 테스트까지 완료하여 deploy 브랜치에 올렸다. 그런데 도커 컨테이너가 꺼져버렸다……. 컨테이너의 상태를 보니 exited(1) 이 떠있었고 log를 통해 확인해 보니 FCM을 사용하기 위한 key를 읽을 수 없다는 log가 찍혀있었다. 어떤 것이 문제였고 어떻게 해결했는지를 정리하고 공유하기 위해 이 글을 작성하였다. 본론 문제가 발생한 부분 FCM 기능을 사용하기 위해서 FCM Service Key가 resources 파일에 있고 @Value 를 통해 resource로 가져와 FirebaseMessaging Bean을 만드는 구조였다. @PostConstruct를 사용한 Bean 생성 코드 일부 로컬에서 돌릴 때는 아무런 문제가 없어서 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bu0tpK/btstxoLTQAe/Df6ioEunjGhBgFClNnl8p1/img.png)
서론 지금 진행중인 프로젝트에서 강의가 등록되었을때, 매니저가 공지사항을 등록했을때, 강의에 선정되었을때 등등 메인 비즈니스 로직에 알람기능은 필수이다. 원래 알람 기능을 맡았던 팀원과 프론트분과 기능을 구현하면서 어려움을 겪고 조금 진행이 늦어지고 있었는데 알람을 담당하던 팀원이 개인 사정으로 인해 프로젝트에서 하차하게 되었고 나와 다른 팀원 1명이서 임시방편으로 기능이 작동하게 고치고 베타 테스팅을 진행하였다. 그 후 FCM 도메인 공부 및 레퍼런스를 찾아보고 기능 수정, 추가 및 리팩토링이 필요하다고 판단을 내렸고 해당 issue 를 내가 담당하게 되었다. 도메인 공부 및 리팩토링을 하면서 고민했던것들, 작성한 코드등을 정리하기 위해 이 글을 작성하였다. 본론 일단 기능 수정 및 리팩토링에 앞서 현..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/biR4nH/btss74OHjL7/URefffnaQPl2zOHDWpKprK/img.png)
서론 스프링 Proxy를 공부하면서 Proxy Factory 에 대해 알게되었다. Proxy Factory는 interface 를 구현하고 있는 class 의 경우에는 JDK 동적 프록시를 사용해서, interface 를 구현하고 있지 않은 경우에는 CGLIB 를 사용해서 프록시를 만들어 주는 식으로 동작한다. Proxy Factory 가 어떻게 이를 구분하고 어떤식으로 proxy 객체를 만드는지 궁금해서 코드를 직접 보면서 간단하게 정리하였다. 본론 프록시 팩토리를 생성하고 해당 팩토리에서 프록시를 가져오는 코드를 먼저 살펴보면 프록시 대상으로 삼을 클래스를 정해준다. ProxyFactory 생성자에 해당 클래스를 넣어서 proxyFactory 를 생성한다. 해당 Factory 에 사용하고 싶은 프록시..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Uh3f8/btssMB0gvrp/MgrkdD4psZ07A8Ok8UYaX1/img.png)
서론 처음에 프로젝트를 시작할때는 예외처리에 대해 깊게 고민하지 않고 비즈니스상 발생하는 Custom Exception 만 만들고 던지면 충분하겠지 라고 생각을했다. 그러나 실제 프로젝트를 진행하면서 client 개발자분은 다른 예외들을 더 많이 마주쳤고 해당 예외에 대해서는 별도의 처리가 안돼있어서 어디서 잘못된건지 알아볼 수 없는 형태였다. 예외가 터질때마다 연락을 하여 물어보는 비효율적인 방식을 개선하기 위해 위해 예외처리에 대해 알아보고 프로젝트에 적용을 하고 어떻게 더 개선할 수 있을까에 대한 고민을 글로 작성하였다. 본론 프로젝트를 진행하면서 client 개발자 분이 가장 자주 마주치는 Exception 들은 MethodArgumentNotValidException HttpMessageConv..
서론 인프콘 2023 에 당첨되어 인프콘에 갔다왔다! 세션도 정말 재미있었고 경품들도 잔뜩 받았다. 나중에 볼 수 있게 들었던 세션들에서 기억나는 내용과 후기를 간단히 남겨 본다. 본론 듣고 싶은 세션들은 정말 많았지만 시간대별로 1 세션만 고를 수 있어서 들어가기 직전까지도 고민을 많이 하였다. 소프트웨어 설계를 위한 추상적, 구조적 사고 변별력을 200% 더 높인 개발자 채용 방법: 코드 리뷰 테스트 어느날 고민 많은 주니어 개발자가 찾아왔다 2탄: 주니어 시절 성장과 고민들 점진적 추상화 스프링과 함께 더 나은 개발자 되기 이렇게 5개의 세션들을 너무 재밌게 들었다. 각 세션별로 기억나는 내용, 후기들이다. 소프트웨어 설계를 위한 추상적, 구조적 사고 초반 내용에서 발표자분이 말하셨던 내용 중 기억..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/6Lb8R/btsqCbaIW5B/C5arWXbZuDu4Fy9fopMkh0/img.png)
서론 현재 진행중인 프로젝트에서는 JWT 토큰으로 인가를 사용하고 있고 Access Token 과 Refresh Token으로 보안을 조금 더 강화시켰다. 로그인 파트를 내가 구현하지는 않아서 처음에는 신경쓰지 않고 있다가 프로젝트 베타 테스트를 하면서 문득 Refresh Token 만으로 보안이 충분한가? 라는 생각이 들었고 여러 자료들을 보고 정리하면서 내 나름의 결론을 내리고 프로젝트 고도화를 할 때 팀원들과 상의할 예정이다. 본론 현재 프로젝트에서는 사용자가 로그인을 하면 Access Token 과 Refresh Token을 만들어 보내주고 클라이언트에서는 Async Storage 에 저장을 하는 형태이다. public String createAccessToken(String account, lo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qWDsW/btspMkGU99g/zMCIe0sBvTlKFfirmSPAwK/img.png)
서론 자바로 알고리즘 문제를 풀면서 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 까지..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/A02I0/btspg1UdMLa/W68iRKKHLHzWYwdWbSvmY1/img.png)
서론 Repository 계층 테스트 코드를 작성할때 처음에는 어플리케이션에서 사용중인 MySQL DB를 그대로 사용하였다. 그러다가 한 테스트에서 로컬에 저장되어 있던 데이터에 의해 테스트가 실패하였고, 물론 값을 바꿔주면 테스트를 통과하긴 하겠으나 이 테스트가 다른 사람 pc에서 안깨지려면 테스트 DB를 분리하는게 맞겠다는 생각이 들었다. Spring 으로 프로젝트를 진행할때 local DB 나 Test DB 로 H2 를 많이 사용하기에 나도 H2 DB 로 설정을 바꿔주고 테스트를 돌렸다. 그런데 잘만 돌아가던 테스트들이 깨지는 케이스가 발생했다. 이를 기억하고 앞으로 코드를 작성할때 주의해야겠다는 생각이 들어 이 글을 작성하였다. 본론 테스트가 깨진 경우는 2가지 였다. native query 사용..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/F7Jmg/btsnK9ndQni/u5801UStV08SxDImu3Q6N0/img.png)
서론 Data 계층 테스트 코드를 작성하기전에 JPA 복습을 하고 있었는데 이전에 공부할때는 그냥 넘어갔던 JPA의 Isolation 부분이 눈에 들어왔다. 고급 데이터 베이스 과목에서 배운 Repetable Read, Phantom Phenomon 등이 보여 흥미로워 복습도 하고 몰랐던 부분을 제대로 공부하기 위해 이 글을 작성하였다. 목차 트랜잭션이란? DB 트랜잭션 Level 에 따른 차이 JPA의 트랜잭션 수준 Optimistic Lock, Pessimistic Lock 트랜잭션이란? 랜잭션, ACID 는 데이터 베이스 과목을 수강하면 정말 많이 나오는 개념이다. 트랜잭션이 무엇일까? DataBase System concepts 7판에 나온 설명들에 따르면 하나의 logical unit을 실행하는..