일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 에프랩
- F-Lab
- ngrinder
- DBDocs
- spring boot
- Thymeleaf
- Enum
- Scheduler
- Database
- junit
- papago
- NaverCloudPlatform
- 회고
- 네이버 클라우드
- AssertJ
- Naver Cloud
- navercloud
- spring
- ncloud
- docker
- mybatis
- Pinpoint
- object storage
- NooBLoL
- Java
- Naver Cloud Platform
- NCP
- OrientalUnity
- 네이버클라우드
- React
- Today
- Total
목록spring (16)
DevJong12

목차 1️⃣ 개요 회사에 입사하고 코드를 분석을 하고 있었는데, 도저히 분석만 하고 있을 수 없고 리팩토링을 진행할 수밖에 없는 환경이었다. 회사 코드를 보여줄수 없으나, 발생하는 문제가 비즈니스 로직이 20N + 1, 15N + 1 을 로직에서 직접 구현을 하고 있었다(아니 JPA를 쓰면서, 왜 이해를 못하고 쓰는데..) 그러다 보니 10개, 20개를 조회하는데도 쿼리가 200번, 400번 , 데이터가 좀 많으면 수만건의 Select절을 실행하고 있었다. 그리 생긴 결과물은, 데이터가 거의 없음에도 API의 요청이 10초~ 15초~ 20초~ 가지각생으로 매우매우 느린상황이었다. 그래서 내가 선언한 어노테이션이 달려있는 메소드들만의 실제 실행 시간을 확인해보고자 기능을 구현하게 되었다... APM등의 부..

목차 1️⃣ 개요 파일의 명칭에 대해서, 내가 간단하게 개발을 진행할 때 OriginalFileName에 대해서 저장을 하지 않았었다. 많은 웹사이트를 쓰면서 원본 파일명을 다시 돌려받은 경우가 거의 없다 보니, 신경을 쓰지 않았었으나 이와 관련되어 문제가 발생하여서 기록을 남겨보게 되었다. 환경은 JDK 17, Spring 3.2.0을 사용하였다. 2️⃣ 이슈내용 Window나 Mac에서 파일을 업로드를 하게 될 경우 들어오는 Multipart의 경우에는 별다른 문제없이 OriginalFileName이 기록이 되었으나, 이걸 DataBase에서 Query를 통해 OriginalFileName이 들어가있는 Column을 Like문으로 검색을 할 때 검색이 되지 않는 문제가 발생하였으며, 검색이 되지 않는..

목차 1️⃣ 프로젝트 소개 프로젝트의 시작을 알리는 아티클에서 적었지만 또 적어보면... 번역을 기반으로 피해자와 가해자들의 모임인 한.중.일이라는 언어도 틀리고, 역사가 꼬여있는 세개의 국가를 주제로 동북아 커뮤니티이다 👉 깃허브 코드 아래 이미지처럼 글을 남길 경우 한국어, 영어, 일본어, 중국어 총 4개국어로 글들이 자동번역되어 타 국가의 사용자와 교류할 수 있는 커뮤니티다. 2️⃣ 구현에 사용된 기술스택 Front의 경우에는 React를 채택하였고, 메인으로 집을만한 라이브러리는 다국어의 페이지를 만들기 위한 i18next과 게시물의 내용을 HTML로 받기 위한 React Quill을 짚어볼 수 있을 것 같다. Back의 경우에는 Java + Spring을 기본으로 채택하였고, 추가적으로 짚어볼 ..

목차 1️⃣ 글 작성에 앞서... 해당 이슈는 우리 팀이 구현한 사용한 도구에 대한 이해가 필요하다. 일단 FrontEnd의 경우 React를 기반으로 작성을 진행하였으며, 이슈가 발생한 장소는 게시물을 등록하는 곳에서 발생이 되었다. 게시물을 등록시 필자의 팀의 경우에는 에디터를 사용하여 게시물을 등록할 수 있도록 기능 구현을 하였으며, 오픈소스중 하나인 React Quill을 활용하였다. Quill자체에는 이미지를 업로드하는 기능이 존재하였으나, 이미지를 업로드할때 발생이 되는 이슈사항에 대하여 기록을 해보고자 한다. 2️⃣ ReactQuill와 Quill을 선정한 이유? 1. ReactQuill이란? 공식페이지에서 소개되어있는 내용으로, 긴 텍스트를 작성할 수 있는 에디터라고 설명이 되어있다. 에디..

목차 1️⃣ 글을 적기에 앞서... 와...정말 보기힘든 기능구현 글이다..! 해당 포스트는 Naver Cloud에서 제공되는 서비스중 하나인 Java를 활용해 Papago Translation을 사용하는 기능구현 방법을 기록해 보고자 한다. 그 중에서도 Text와 HTML번역에 대하여 다룰 예정이다. 또한 필자의 프로젝트의 경우 한국어, 영어, 중국어, 일본어만 활용했다보니 언어가 지원이 안되는 경우는 한개의 케이스밖에 없었다. 여러개의 언어를 활용하면 서비스를 지원하지 않는 언어타입도 존재하니 주의하기 바란다. 2️⃣ Papago Translation API 1. API 이용 신청 먼저 API를 활용하기 위해선 사용부터 해야한다. 이용신청을 할 경우 다음의 이미지들이 뜬다. 생성 및 동의를 먼저 해주..

목차 1️⃣ Effective Log Search & Analytics란? 네이버 클라우드의 설명은 다음과 같으며, 역할은 그냥 로그수집기로, 일정 금액을 내면서 로그수집하는것이다. 2️⃣ 사용 이유 먼저 필자가 구성한 인프라 아키텍쳐를 확인이 필요하다. 아래의 이미지는 필자가 구축한 인프라다. 위의 이미지를 확인해보면 알 수 있듯이 Spring을 실행하는 서버가 3개다.. 즉 내가 로그를 확인하려면 일일이 Private한 서버에 직접 접속을 해서 Docker의 Container Log를 확인해야 하는 문제가 발생한다. 즉 귀찮다~ 이말이다. Log4j를 사용한 로그를 편하게 한곳에서 보고 싶다는 니즈를 만족하고자 Effective Log Search & Analytics를 도입해야겠다는 판단을 하게 되..

목차 1️⃣ 글을 시작하기에 앞서... 해당 글은 바로 적용할 수 없고 선수 과정으로 [OrientalUnity] PinPoint의 설치 과정이 이뤄져야 한다. 그 이유는 해당 작업은 Agent를 설정하는 것으로, PinPoint의 경우에는 Agent → Collector로 정보를 전달을 해주기 때문에 Agent의 정보를 수집해야 하는 Collector가 존재해야 하기 떄문이다. 위의 링크는 이러한 Collector, 그리고 가시적으로 확인이 가능한 Web어플리케이션을 실행하는 과정이니 먼저 확인하기 바란다. 또한 해당 글은 컨테이너 이미지로 빌드하고, 실행하는 Spring Boot Application에 PinPoint를 적용하는 과정이며 실제 클라우드환경이기 때문에, 유사한 환경에서만 참고하기를 바란..

목차 과거에 사용이력이 있어서 PinPoint를 적은줄 알았는데.. 적은 적도 없었을 줄은 몰랐다.. 1️⃣ PinPoint란? PinPoint는 어플리케이션 성능 관리(APM) 도구 중 하나로, 분산 시스템 환경에서 애플리케이션의 성능을 모니터링하고 분석하는 데 사용된다. 특히 대규모의 분산 어플리케이션 및 MSA에서 성능의 문제를 식별하고 해결하는데 도움을 주는 도구이다. 이건 그냥 GPT한테서 받은 대답으로, PinPoint는 어플리케이션에 대한 성능관리로 하기 4가지의 기능을 제공한다. 모니터링: Pinpoint는 애플리케이션의 성능 데이터를 실시간으로 수집하고 모니터링합니다. 이는 서버, 데이터베이스, 네트워크, HTTP 요청 및 기타 리소스와 관련된 성능 지표를 추적하는 데 도움이 됩니다. 추..

목차 프로젝트 정보 및 발표영상 이 글을 작성할 당시에 프로젝트는 완성이 되었다 보니... 프로젝트 링크를 달게 되었다.. 사실 프로젝트를 진행하면서 꾸준히 회고글이라든가 프로젝트를 진행중인 내용의 글을 작성하고 싶었으나... 변명이겠지만 자느라 바빴다...🤣 처음에 내 얼굴이 바로나오다 보니까...민망해서.. 난 영상을 제대로 보지를 못했다 https://github.com/hook-killer 물음표살인마 개발을 함에 있어 항상 왜?를 서로에게 질문하며 곤란하게 만들자는 의미의 팀명입니다. 물음표살인마 has 4 repositories available. Follow their code on GitHub. github.com HTML 삽입 미리보기할 수 없는 소스 1️⃣ 팀 결성? 사실 나는 해당 프..

목차 💡해당 페이지에서 모든 메일 실행 로직에 대해서는 Thread.sleep(500)으로 대체하였다. 이유는 메일을 발송함에 있어 한계가 존재하나, 실제 걸리는 시간은 약 500ms~1000ms로 확인하였기 떄문에, 성능 테스트에까지 굳이 메일 API를 확인할 필요는 없다고 판단하였다. 💡메소드는 스케쥴러 메소드 한개만을 기준으로 작업을 진행하였다. 개요 아래의 게시물에서 지난번에 MailService와 연결한 코드를 볼 수 있다. 메일서비스와 연계하면서 메일 시간에 대해서 측정을 하고 보니, 많은 양의 게시물의 상태값을 변경하고자 하면 너무나도 오랜시간을 Scheduler메소드가 잡혀있으면서, 상태값이 변경되지 않는 문제를 장애로 인식을 해볼 수 있게 되었다. [Picasso][Spring] @Sch..

목차 개요 💡해당 게시물은 Scheduled API를 뜯어보는 게시물이 아니다. 필자가 필요한 만큼만 활용을 하였다. 프로젝트를 제작함에 있어서, 올라온 게시물이 경매시작일인 경우 경매를 시작하거나 유찰이 되도록 상태값을 변경하고, 사용자한테 메일을 발송해야 하는 로직이 존재하였다. 상태를 변경함에 있어서 Database의 Event Scheduler를 활용하는 것도 방법이 될 수 있었다. 하지만 그건 결코 좋은 방법이 아니라고 필자는 생각했고, 첫번째로는 그래봐야 메일도 제시간에 보내야 하는것이었고, 두번째로는 해당이유가 대부분의 이유를 차지하는데 Database에 의존을 해야 하게 되는 문제가 발생하기 떄문이다. Database에 의존을 해버리게 되면 추후 Database를 MySQL에서 Oracl..

목차 개요 이번에 프로젝트를 진행하면서 프로젝트 내부에서 보내야 하는 메일 종류가 매우 많았다. 가벼운 생각만으로도 5종류가 넘었는데, 깊게 생각하고 보니 10종류가 넘어갔다. (실제 시간이 부족해서 구현한 메일은 사실 6개인가 밖에 안되는건 안비밀) 어쨋든... 그러다 보니 여러종류의 메일에 대처를 해야 했고, 템플릿화 해서 메일을 관리하는 수밖에 없었다. 내가 템플릿화하여 어떻게 진행하였는지를 기록해 보고자 한다. 추가 의존성 다음 두가지를 추가하였다, 필자는 Thymeleaf를 사용해 thymeleaf용 html을 미리 template화 하는데 활용하였으며, 메일 발송을 위한 spring-boot-starter-mail을 추가하였다 implementation 'org.springframework.b..

목차 개발 개요 별다른건 없고..Naver Cloud의 Object Storage를 개별로 Upload Util을 만들걸 생각하니까 머리가 지끈거려와서 공통기능으로 추출해주고 사용하면 좋을 것 같다고 생각하여 제작하였다. 추가적으로 한개의 버킷에서 dev/~, local/~ 형식으로 경로를 나눠가며 활용을 하고 싶었다. 이에 따른 코드를 공유해 보고자 한다. 의존성 추가 Common-io의 경우 확장자를 편하게 추출하기 위해 활용하였다. 또한 amazone의 aws-java-sdk의 경우 Naver Cloud에서는 Object Storage에서 오픈소스로 제작을 한 부분이다 보니 그대로 사용이 가능하였다. //File api 'commons-io:commons-io:2.13.0' // Amazon AWS..
테스트 코드에 대한 소개 TDD에 대해서 1.TDD와 단위 테스트(Unit Test)는 다르다. 2. TDD는 테스트가 주도하는 개발로 테스트 코드를 먼저 작성하는 것에서부터 시작한다. TDD의 사이클링 순서 Red - 항상 실패하는 테스트를 먼저 작성 Green - 테스트가 통과하는 프로덕션 코드를 작성 Refactor - 테스트가 통과하면 프로덕션 코드의 리팩토링 단위 테스트 기능 단위의 테스트 코드를 작성하는 것 TDD와 다르게 테스트코드를 먼저 작성하지도 않으며 리팩토링도 포함되지 않고 순수히 테스트 코드만 만드는 것을 의미한다. 테스트 코드를 작성하는 이유 단위 테스트는 개발단계 초기에 문제를 발견하도록 도와준다. 단위테스트는 개발자가 나중에 코드를 리팩토링 하거나 라이브러리에 업그레이드등에서 ..

개요 프로젝트의 기능 개발은 완료되었다 보니 부하테스트를 진행해보고자 nGrinder를 설치해보고자 하였다. 이포스트는 nGrinder의 Controller와 Agent의 설치과정을 작성하였다. nGrinder란? 어플리케이션의 부하 테스트 용도로 많이 사용되는 툴중에 하나로 nGrinder는 Controller와 Agent로 구성이 되어 있으며 두개를 같은 서버에 설치해도 되고 서로 다른 서버에 설치를 해도 된다. ※ 부하테스트이다 보니 추천하는건 서로 다른 서버에 설치를 하는 것을 추천하며 Agent는 어플리케이션이 존재하는 서버에 설치해야 한다. ※ 공식문서에서 3GB의 Free Memory라는 문구를 봤던 것 같은데 다시 찾으려니 못찾겠다.. 해당 문구를 보고 새 Controller서버를 분할 하..

개요 현재 기능 구현을 진행하면서 로그인을 임베디드된 톰캣에 세션으로 정보저장을 하고자 HttpServletRequest를 받아야 하는 메소드를 제작을 하였는데, 해당 기능에 대해서 테스트케이스를 제작을 하고 싶었다. 일반적인 Object의 경우라면 Mock을 사용하면 되지만 HttpServletRequest, Response도 가능한가? 생각하면서, 찾아서 알게된 MockHttpServletRequest와 MockHttpServletResponse에 대해서 기록하고자 한다. 참고한 자료는 아래의 북마크이다. https://www.baeldung.com/java-httpservletrequest-mock How to Mock HttpServletRequest | Baeldung Learn multiple..