분류 전체보기

서울우유와 함께 한 기업프로젝트가 끝났다.구현이 끝났으니, 성능을 측정해보고 개선을 해보자!개선을 해볼 API는 공지사항 조회이다.아무래도 모든 유저가 접근할 수 있는 API이기도 하고, 읽기 작업이 주를 이루는 API이므로 선택했다.성능 비교성능을 개선하기 전에 어떤 지점에서 조회 성능이 떨어지는지를 확인해보자! 서울우유 측에서 받은 정보이다.관련 업무를 처리하는 인원이 50명이므로, 테스트 시 인원 수 Max를 50으로 맞췄다.1 페이지에만 접근하기 모든 유저가 공지사항 페이지에 접근하면 첫 번째 페이지로 접근한다.page == 1 인 API에 대해 성능을 체크해보자.request  성공 여부 고려 11000 건 데이터 1000000건 데이터((백만건) 10000000건 데이터 (천만건) reques..
이 글을 쓰게 된 계기큐시즘 31기 기업프로젝트에서 서울우유의 업무 프로세스 개선 프로젝트를 하게되었다.우리가 개선하고 한 프로세스에 대해 간단히 소개하면...기존 업무 프로세스 서울우유의 대리점은 마트, 슈퍼에 납품을 한다.본사에서는 판매량 증가를 통한 이윤 상승을 위해→ 대리점이 저렴하게 납품을 하도록 한다. (할인해서 납품)이후 대리점은 납품한 내역(세금계산서)을 본사에 제출한다.본사는 국세청 홈택스 사이트에서 세금계산서의 *진위여부를 확인한다.맞다면, 지급결의서를 작성한다.이후 본사에서는 지급결의서의 내용대로 대리점에게 금액을 지급한다.그런데 이 과정을 직원들이 수기로 하고 있었다. 대리점에서 전달받은 세금계산서를 서울우유 지점 엄부 담당자가 국세청 홈택스 사이트에서 진위여부를 확인한다. (진위여..
최근 Kotlin과 SpringBoot, MSA를 활용한 프로젝트를 진행하고 있다.MSA는 장점이 많은 아키텍쳐이지만, 해결해야 할 문제도 있다. 그 중 이번 글에선 장애 전파를 막는 방법, 그 중에서도 서킷 브레이커에 대한 실습을 정리해본다. (코드는 https://github.com/HoyeongJeon/spring-circuit 에서 볼 수 있다.)개념 정리1. 장애 전파를 막는 것이 왜 중요할까?MSA 환경에선 각 서비스가 독립적으로 운영된다. 그러다 보니 다른 서비스에 필요한 데이터가 있을 경우, 요청을 보내 데이터를 얻어온다.여기서 문제는 다른 서비스에 장애가 생겼을 경우다. 이런 경우, 정상 서비스는 지속적인 에러 응답을 받게 된다. 이러면, B 서비스에서 발생한 장애가 A 서비스에도 전파 ..
(이 글을 적는 가장 큰 목적은 여러 상황(JPA, JPQL, Nativa Query, @Transactional 의 조합) 에서 쿼리가 어떻게 날아가는지 보는 것이기에, 영속성 컨텍스트에 대한 자세한 설명은 하지 않을 예정입니다.) JPA를 배우면 영속성 컨텍스트에 대해 배우게 된다.영속성 컨텍스트에 대해 간단히 설명하면 , "애플리케이션과 DB 사이에 영속화된 엔티티를 관리하는 논리적 공간" 으로 정의할 수 있다.영속화란 엔티티를 영속성 컨텍스트가 관리할 수 있게 만드는 것이다. 영속성 컨텍스트에 대해 간단히 알아보자.영속성 컨텍스트에 대한 간단한 공부영속성 컨텍스트는 DB로의 접근을 최소화고, 동일한 엔티티의 동등성을 보장하기 위해 다음 4가지 기능을 제공한다. 1. 1차 캐시개발자가 DB에 특정 ..
JPA의 쿼리가 어떻게 날아가는지 여러 방면으로 공부하다 save() 동작에 대한 의문이 생겼다.그래서 깊게 알아보려 한다.( 전체 코드 👉🏻 https://github.com/HoyeongJeon/blog-code/tree/main/howsavework )고민의 시작 public void testNoneAnnotation() { System.out.println("// JPA만 사용하기(@Transactional 이 없는 경우)"); Member member = memberRepository.findById(1L).get(); member.setAge(35); memberRepository.save(member); S..
무한스크롤의 경우, 어떻게 Redis 키를 설정하면 좋을지에 대한 고민(생각의 흐름을 적고, 정리해보는거라 두서없을 가능성 200%입니다.) 문제사항게시판 글목록 캐시하기 단, 100개씩 보여주는 무한 스크롤내가 생각한 캐시 고려사항데이터 정합성메모리 효율성TTL 관리 여러 사항을 고려해 보기 키 당 데이터를 50개씩 저장하면?가장 최신 글의 ID가 1100이라 해보자.처음 게시판에 들어오면 다음과 같이 데이터 캐시  1100 - 1051,1050 - 1001 유저 쭉쭉 내리다 1001에 닿으면서버로 요청을 보내서1000 - 951 캐시하고,950 - 901 캐시함. → 이건 좀 비효율적이다.왜 ?한 번에 보여줘야 할 데이터가 100개인데, 해당 데이터를 보여주기 위해 계속 2번 나눠서 저장해야 한다.즉..
N+1 문제란?N+1문제란 연관 관계가 설정된 엔티티를 조회할 때 ,엔티티를 조회하는 쿼리 1번에 해당 엔티티에 연관된 N번의 쿼리가 추가로 실행되는 것을 말한다.예를 들어, 멤버 한명이 10개의 글을 썼다고 가정할 때, 멤버를 조회하면 이 멤버와 연관된 10개의 글을 가져오기 위해 추가로 10개의 쿼리가 실행되는 것이다. (1+N이라 하는 것이 더 이해하기 쉬울듯!)왜 발생할까?멤버와 게시글을 예시로 코드를 보며 이해해보자. 멤버와 게시글의 관계는 1 : N 이다.  @Entity@Datapublic class Member { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "mem..
· ✨ 회고
2024년은 참 많은 일이 있었다.개인적으로도, 커리어적으로도 다사다난했다.사람의 기억이라는 게 그 순간엔 영원할 것 같지만 며칠만 지나도 흐려지더라.삶의 언제가 가장 좋았고 기억에 남는 년도였냐고 물어본다면 2022년이라 답하는데, 2024년도 그에 못지않게 많은 변화와 일이 있었던 해이고, 올해(이미 지났지만 ㅎ)를 잊지 않기 위해 회고를 진행해보려 한다. 부트캠프보안학과에 있으며 보안을 공부했었다.단순한 이유는 아니었지만, 보안을 그만하고 개발을 해야겠단 생각을 갖게 되었다. 교환학생, 인턴 등의 이유로 한 학기를 휴학했어야 했는데 그 기간 동안 부트캠프에 들어가게 되었다.아무래도 허송세월 보내고 싶지 않았고 부트캠프를 하면 스스로를 좀 더 채찍질하며 개발 공부를 할 수 있을 거라 생각했다.그렇게 ..
조각조각 프로젝트를 진행하면서 블루/그린 무중단 배포를 진행했다.이번 글에선어떻게 아키텍쳐가 변화해 왔는지왜 무중단 배포로 변경했는지어떻게 블루/그린 무중단 배포를 구현했는지의 순서로 적어보겠다! (무중단 배포가 궁금한 사람들은 해당 부분만 찾아서 보면 된다.)아키텍처가 변화해온 과정1. 초기 아키텍쳐 초기 상태는 위와 같았다.Github Actions를 사용해 CI/CD 파이프라인을 구성했다. Nginx를 통해 프록시를 설정했고, Docker를 사용해 스프링부트 애플리케이션을 띄웠다. 비용을 절감하기 위해 DB는 AWS를 사용했다. CI/CD는 다음과 같은 형식으로 이뤄졌다.테스트 및 빌드컨테이너 레지스트리에 이미지를 pushNCP에 docker image pullDocker를 통해 띄움.초기 배포에 ..
· ✨ 회고
(글을 올리는 지금은 큐시즘 30기가 끝난 시점이다! 그러나 이 글은 합격하자마자 썼던 글이다 ㅎㅎ 30기가 끝이 난 지금 나의 다짐? 같던 후기를 읽어보니 지난 3~4개월이 스쳐지나간다! 최종후기도 따로 적을 예정이니 많관부!)개발 공부를 시작하며 주로 혼자 개발을 해야하는 경우가 많았다. 그러다보니 협업을 하고싶었 얻고 싶었고, 개발 동아리에 들어가고 싶었다.다양한 개발 연합 동아리가 있지만 그 중 큐시즘에 들어가고 싶었는데 운이 좋게도 합격을 하게 되었다.지원준비하면서 다른 분들의 후기가 많은 도움이 되었기에 나도 후기를 작성해보려 한다.1. 서류1. 큐시즘 지원 동기를 포함해 자신에 대해 소개해 주세요. (700자 이내) 가장 고민을 많이 했던 부분이었다.이 부분은 큐시즘 유튜브가 큰 도움이 되었..
· ✨ 회고
짧다면 짧고, 길다면 긴 밋업 프로젝트가 끝이 났다! 대략 2~3달간의 시간을 쏟으며 몰입했던 프로젝트였다. 밀도있는 시간을 보냈기에 실제 시간보다 2배 이상의 시간을 보낸 것만 같은 기분이다.밋업 프로젝트에 대한 최종 후기인 만큼 어떤 마음으로 이 프로젝트에 들어오게 되었는지를 시작으로 주저리주저리 적어볼 생각이다! (개발에 관한 내용은 없다. 두 달간 여러 일을 되돌아 볼 예정이다. 찐 큐시즘 최종 후기는 또 따로 적을 예정이다!!) 팀 선정밋업 프로젝트를 시작하기 전 여러 아이디어 발제자가 본인들의 멋진 아이디어를 소개하는  큐넥팅이 있다.큐넥팅은 발제자들이 자신의 아이디어에 대해 발표하고, 학회원들이 발제자와 아이디어에 대한 이야기를 나누며 본인이 원하는 아이디어를 찾아가는 날이다!아쉽게도 그날 ..
이번 글에선 refreshToken을 통해 만료된 accessToken을 재발급 받고 사용자의 로그인 상태를 유지하는 방법을 알아보자.프론트엔드 코드는 ReactJS를 사용할 예정이고, 백엔드는 SpringBoot , NestJS를 사용할 예정이다.(프론트엔드 개발자라면 ReactJS, 백엔드 개발자라면 본인이 사용하는 스택의 코드를 보면 된다!) 먼저 JWT 토큰에 대해선 모두 잘 알고있다 생각하고 간단히 설명을 하고 넘어가겠다. (기본적으로 제가 작성하는 모든 글은 프로그래밍을 처음 공부하는 저에게 필요했던 내용들입니다.과거의 제가 알고 싶었지만 찾지 못했던 내용들을 알게된 현재의 제가 과거의 저에게 설명한단 생각으로 쓰는 글입니다.그러니 매우 쉬운 내용도 자세히 풀어서 설명되어 있을 수 있습니다.아..
· 🟩 NCP
큐시즘에 들어오기 위해 지원서를 작성하고 면접을 봤던 순간이 어제같은데 벌써 큐시즘의 막바지에 다다르고 있다.더웠던 날씨가 쌀쌀해지고 가을을 넘어 겨울이 다가오는 지금, 좋은 팀원들과 함께하는 밋업 프로젝트를 잊지않기 위해 중간회고를 하려한다.  개발 공부를 하다보면"배포를 진행해야 한다.""로컬에서만 돌아가는 프로젝트는 큰 의미가 없다."같은 얘기를 많이 듣는다. 나도 공감하는 바인데, 배포란게 무료도 아니고 뚝딱~ 되는 것도 아니다. 큐시즘에선 Naver Cloud Platform(이하 NCP)과 협업한다.NCP에서 제공해준 크레딧을 활용해 다양한 인프라 및 AI 기술을 사용할 수 있다.돈 걱정 없이 클라우드 기술을 활용하고 배포도 할 수 있다는 뜻!!(큐시즘짱) 중간회고로 우리 프로젝트의 소개 , ..
· 🟩 NCP
깃허브에 우리가 코드를 저장하고 다른 사람의 코드를 내려받듯이, 도커이미지도 깃허브와 같은 저장소에 이미지를 저장하고 내려받을 수 있다.가장 유명한 퍼블릭 저장소는 DockerHub 이지만, 해당 저장소는 퍼블릭이기에 모두가 접근할 수 있다.프라이빗한 저장소도 필요할 때가 있다!  NCP에선 프라이빗 도커 컨테이너 이미지를 보관하고 , 관리, 배포할 수 있는 서비스를 제공한다.이를 Container Registry 라 부르는데, 이번 글에선 Container Registry 를 생성하는 과정을 적어보겠다. 그런데 Container Registry를 생성하려면 먼저 Object Storage를 만들어야 한다. (Object Storage의 버킷(저장소)에 Docker 컨테이너 이미지가 저장된다.) Obje..
본 글의 예제 코드는 JavaScript를 사용했습니다. JavaScript를 모르고, Node.js를 모른다면 Node.js에는 이런 개념이 있구나~ 정도로 이해하면 감사하겠습니다~!최근 자바를 열심히 하고 있다.JS도 잊지않기 위해 간단한 개념 정리를 해보려고 한다.오늘은 비동기 프로그래밍에 대해 정리해보고자 한다. JS에서 함수를 호출하면 함수의 실행 컨텍스트(실행 컨텍스트란 JS에서 실행할 코드에 제공할 환경 정보를 모아놓은 객체이다!)가 생성된다.https://junilhwang.github.io/TIL/Javascript/Domain/Execution-Context/ 실행 컨텍스트(VE, LE , this binding)는 콜 스택에 쌓이고, 함수가 실행된다.함수가 실행을 끝내면, 해당 함수의..
이번 글에선 무료 도메인을 발급받고 https를 적용해보겠습니다. https를 적용한다는 것은 서버에 배포가 되어있는 상태이겠죠!? (서버에 배포가 되어있다 가정하고 글을 적어보겠습니다.) 1. 무료 도메인 발급받기https를 적용하려면 먼저 도메인을 발급받아야 합니다.도메인을 발급받는 방법은 여러가지이지만...(가비아, Route 53 등)돈은 아끼면 좋으니 여기선 무료 도메인을 발급받겠습니다. https://xn--220b31d95hq8o.xn--3e0b707e/  내도메인.한국 - 한글 무료 도메인 등록센터한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공xn--220b31d95hq8o.xn--3e0b707e 1.1  회원가입 1.2  도메인 입력하기 위 검색 결과에서 원..
· 🟩 NCP
큐시즘 밋업 프로젝트를 진행하며 AI 튜닝을 진행하게 되었다.튜닝(모델 훈련)을 하는 방법을 찾아봤지만 다 비슷한 글에다 네이버에서 올라온 홍보와 비슷한 글 밖에 없었다. 잘하는 분들은 다 문서를 찾아보며 하겠지만... 나에겐 헷갈리는 과정이 많았기에 포스트로 정리해보려 한다!(답답해서 내가 쓴다!) 학습 데이터 생성하기https://clovastudio.ncloud.com/tuning/api CLOVA Studio clovastudio.ncloud.com먼저 학습시킬 데이터를 만들어야 한다. 데이터의 경우 csv, json 파일로 만들어야 하는데, 우리 팀은 csv를 사용했다. 어떤 형식으로 AI를 사용할지에 따라 싱글턴인지 멀티턴인지가 결정된다.만약 한 번의 질문으로 답을 얻어오는 경우라면 싱글턴(우..
에러들...1. CI 도중 Redis 연결이 안됨2. CI 서버에서 배포 서버로 docker-compose.yml 파일 전송이 안됨.3. 배포서버의 deploy.sh 에서 에러가 발생함.문제를 해결하고 난 뒤 보니까 간단해보이지만... 새벽에 3시간넘게 붙잡고 있었다...(함께 에러 해결을 위해 정보를 찾아준 최고의 개발리드 성민아 고마워🥹)  시너지 프로젝트 작업 중 Redis를 사용하게 되었다. NCP를 지원받았지만 , Cloud for Redis 비용이 막대했기에 Redis는 컨테이너로 띄워서 배포하기로 결정했다.이때부터 CI/CD 에서 에러가 터지기 시작했다. 1. CI 도중 Redis 연결이 안됨일단 첫번째 에러는 CI 도중 Redis 연결이 안됐고, 의존성 주입이 되지 않았다. CI 도중 테..
· 🟩 NCP
큐시즘 밋업 프로젝트 중 네이버 클라우드의 지원을 받게 되었다.NCP(네이버 클라우드) 서버를 만들어보자.(신규회원의 경우 10만원의 크레딧을 준다. 나의 경우 지원을 받아 더 많은 크레딧이 있지만, 내가 적용한 서버는 8만원대의 금액이므로 초기회원에게 주는 크레딧으로 충분할 것이다.)https://www.ncloud.com/product/compute/server1. 콘솔 클릭 2. Services 클릭왜 인지 모르겠지만 현재 한국에선 classic 플랫폼이 지원되지 않는다. 네이버 클라우드를 찾아보면 classic도 지원이 된다고 나와있지만... 이유는 모르겠다. (classic이 더 저렴하다.)3. Services 클릭4. 서버 생성 5. 콘솔 선택 6. 원하는 이미지를 선택한 후 서버 생성 7. ..
문제상황개발자 유미님의 SpringSecurity 강의를 듣던 중 문제 발생. 컨트롤러import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class LoginController { @GetMapping("/login") public String loginP() { return "login"; }} 템플릿 엔진(mustache)login page  /login으로 접속을 하면 login 만 출력이 된다.문제해결@RestController -> @Controll..