우아한 테크코스의 레벨1 로또 미션의 프로그래밍 요구 사항에 모든 원시값과 문자열을 포장한다라는 요구 사항이 있었는데 이를 충족 시키기위해 원시 값 포장에 대해 공부하게 되었다. 원시값 포장은 도메인 객체를 나타내기 위해 Anti pattern(primitive(int
우테코 레벨1 자동차 미션을 진행하면서 MVC에 대해 공부해보았다. 공부한 것을 토대로 리팩토링을 진행했는데 이때 View가 어떤 역할까지 책임져야 하는지 궁금했다.위의 기존 코드에선 InputView에서 메서드도 많이 없어서(이렇게 안하면 도메인에서 생성자로 받을 때
체스 미션을 구현하던 중 pawn의 특이한 성질 때문에 체스판의 기물이 pawn인지 확인해야 하는 로직이 필요했다. 그때 고민이 생겼는데 추상 클래스인 Piece에 추상 메서드인 isPawn()을 만들어 pawn인지 확인한다. instanceof를 사용해 Piece구현
우아한테크코스의 체스미션을 스프링으로 바꿔보는 과정에서 HTTP 메서드에 대한 궁금증이 생겼다. Get, Post는 각각 조회, 등록의 의미가 있다는 것으로 이해를 했는데 Put과 Patch는 둘 다 수정의 의미인데 어떤 차이가 있을까? 또한 조사해보니 Post도 수정
학습동기 학습내용 @ResponseBody @Controller @RestController @GetMapping @PostMapping @Service @Repository @JdbcTest @Autowired @ExceptionHandler @
우아한테크코스의 레벨2 지하철 노선도 미션의 인수 테스트를 작성하면서 Request와 Response 메세지를 볼 기회가 많았다. 늘 body의 data들만 중요하다고 생각했었는데 header값들의 의미도 궁금해졌다. header의 의미를 알면 http 통신에 대해 더
학습동기 우아한테크코스 미션을 하는 중에 무심코 사용하던 스프링 빈 등록에 대해 궁금하게 되었다. '스프링 컨테이너가 등록된 빈을 관리해준다.' ? 무지성으로 사용하던 @Component(@Controller, @Servicem @Repository) 그리고 @Aut
학습동기 우아한테크코스 레벨2 장바구니 미션을 하는 중 intercepter라는 개념이 등장했다? intercepter가 뭔대?? 컨트롤러의 중복 로직을 제거하기 위해 핸들러 수행 전/후처리 동작을 추가하여 중복을 제거하기 위해서 존재한다고??.... 모르는게 너무 많
우아한테크코스 지하철 경로 조회 미션을 중에 최단 경로를 조회하기 위해 외부 라이브러리인 JGrapht를 사용하게 되었다. 이때 외부 라이브러리와 도메인을 분리하기 위해 Adapter pattern을 사용했다. 페어의 도움으로 알게된 지식이라 이 지식을 내 것으로 만들
우아한테크코스 레벨3 프로젝트에서 기술 스택으로 JPA를 쓰기로 정해졌다. 근데 JPA는 왜 쓸까? JPA는 뭐고 어떻게 동작할까?JPA는 Java Persistence API로 관계형 데이터베이스(RDBMS)객체를 자바 객체로 매핑하는 자바 표준 스펙이다. 여기서 객
학습동기 얼마전에 우아한테크코스에서 제이슨의 JPA 강의를 들었다. 프로젝트에서 JPA를 쓰는 입장인데 내가 JPA에 대해 '모르는 것이 많구나.'라고 느끼게 되는 강의였다. JPA에 대해 좀 더 공부하고자 학습을 다짐했다. 학습내용 우선 JPA의 가장 중요한 특징이
조회와 flush 이쯤에서 flush에 대해서 좀 더 알아보자. member.setName(); findAll(); findById(); findByName();
우아한테크코스 프롤로그의 댓글 기능을 개발하고 코드 리뷰를 받았는데 아래와 같은 리뷰를 받았다. 해당 JPQL은 내가 짠 것은 아니지만(루키가 짰다.) 내가 JPQL을 제대로 모를 뿐더러 기본적인 개념인 아우터 조인과 이너 조인에 대해서도 정확히 모른다는 것을 깨닫게
우아한테크코스 레벨3 프로젝트에서 JPA와 Mysql을 쓰고 있다. JPA는Transaction 단위로 동작한다. 따라서 JPA를 사용하는 입장에서 Transaction의 개념에 대해 잘 알아야 한다고 생각해 왔지만 그러지 못하고 있었기 때문에 학습을 다짐하게 됐다.(
학습동기 우아한테크코스 레벨3 프로젝트에서 JPA를 쓰고 있다. JPA는 Transaction 단위로 동작한다. 따라서 JPA를 사용하는 입장에서 Transaction의 개념에 대해 잘 알아야 한다고 생각해 왔지만 그러지 못하고 있었기 때문에 학습을 다짐하게 됐다.(내
이전 포스팅에서 Transactional을 학습한 이후에 Transactional 전파에 대한 학습을 약속했기 때문에 Transactional 전파라는 주제로 추가학습을 진행하게 됐다. 어떤 트갠잭션이 동작중인 과정에서 다른 트랜잭션을 실행할 경우 '어떻게 처리하는 가
현재 프로젝트의 controller를 mockito와 MockMvc를 이용해 테스트하고 있다. level2 장바구니 미션의 기본으로 주어진 controllerTest 코드에서 mockito와 MockMvc를 사용하고 있었기 때문에 무지성으로 사용하고 있었던 것….. 그
우아한테크코스 프로젝트에서 CI/CD를 적용해 봤다. 처음 접하는 개념이라 적용하는데 꽤나 애먹었었는데 정작 기록은 하지 못했었다. 차근차근 정리를 해보기 위해 학습을 다짐하게 되었다. 우선 CI/CD가 뭔지 부터 알아보자. 애플리케이션 개발 단계를 자동화하여 애플리케
우아한테크코스 프로젝트 수행 중 로깅을 도입하였다. 처음 접하는 개념이었어서 시행착오가 많았다. 이를 정리하기 위해 학습을 계획했다. 우선 로깅이 뭔지 부터 간략하게 알아보자. 프로그렘 동작 시 발생하는 모든 일을 기록하는 행위로깅을 통해 크게 서비스 동작 상태와 장애
우아한테크코스 프로젝트 중, 큰 문제가 발생했다. 문제가 뭐냐면...image(연속으로 예약하기 버튼을 계속 누르면 위 에러가 계속 발생해 서비스가 다운되는 문제....)예약하기가 2초가 걸리는 상황사용자 입장에서 오래걸리면 예약하기를 연속해서 누르게 되는데 그렇게 하
우아한테크코스 프로젝트에서 스프링부트를 사용하여 백엔드 개발을 하고 있다. 데모데이 요구사항으로 스프링부트 스레드 설정을 적절하게 바꾸라는 요구사항이 있었고 각 팀마다 바꾼 설정 값을 다른 팀들과 데모데이 날 공유하는 시간을 가졌다. 설정 값을 바꾸는 과정에서 새로운
학습 동기 우아한테크코스 프로젝트의 기능이 얼추 마무리되고 드디어 리팩토링을 하게 됐다. 리팩토링 주제는 쿼리 개선하기!! 예전부터 하고 싶었던 주제였는데 드디어 기회가 왔다. 쿼리에 대해서는 그저 JPA에서 제공해주는 메서드를 이용해서 모두 처리하고 있었다.... J
앞서 작성한 JPA 쿼리 개선기1에 이어 진행하고 있는 프로젝트의 쿼리를 개선한 내용을 정리하기 위해 글쓰기를 다짐하게 되었다. 그럼 쿼리 개선기2 시작해보자...! 프로젝트를 릴리즈하고 나서 사용자로부터 다음과 같은 피드백이 들어왔다. 코치가 면담가능한 일정이 등록되
앞서 작성한 쿼리 개선기1, 쿼리 개선기2에 이어 진행하고 있는 프로젝트의 쿼리를 개선한 내용을 정리하기 위해 글쓰기를 다짐하게 되었다. 그럼 쿼리 개선기3 시작해보자...!ServiceRepository위의 로직은 코치가 자신의 예약 목록을 확인할 수 있는 코치가 보
현재 우테코에서 진행하고 있는 프로젝트에서 Spring data jpa에서 제공하는 saveAll()메서드를 사용하고 있다. saveAll() 메서드가 batch insert가 적용되지 않는다는 점을 깨달아 버렸고.... 1차적으로 이를 해결하기 위해 시작한 쿼리 개선
프로젝트를 릴리즈한 이후, 사용자 피드백을 반영하며 prod 환경으로의 배포가 잦아졌다. 문제는 배포를 할 때마다 기존 서버를 내리고 새롭게 띄우는 과정에서 평균 10초 이상의 다운타임이 발생한다는 것이었다. 사용자가 사용하는 운영 서버가 10초 이상 다운되는 것은 큰
이펙티브 자바 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라를 읽으며 내용을 기록하고 궁금한 내용을 공부하기 위해서 학습을 다짐하게 되었다. 생성자와 정적 팩터리는 매개변수가 많아진다면 대응하기 어렵다. 이럴 때는 최종적으로 객체의 불변성과 가독성 모두를 보장
코딩테스트 문제를 푸는 중에 Map을 사용해야 할 때가 있었다. Map의 value 타입으로 List를 사용했는데 이때 value를 초기화할 때 Arrays.asList()를 사용하였다. 하지만 Arrays.asList()로 생성된 List에서 값이 추가되지 않고 Un
이전에 무중단 배포 스크립트를 짤 때 쉡 스크립트를 사용했었다. 당시에는 무중단 배포를 통해 서비스의 다운 타임을 해결하는데 집중해 쉡 스크립트 내에서 사용한 리눅스 명령어들을 잘 알지 못하고 썼었다. 이참에 내가 사용한 리눅스 명령어들에 대해 알아보기 위해 학습을 다
Situation 쿠폰 프로젝트를 진행하던 중, APP내 쿠폰 코드 등록 어뷰징 방지를 위한 기능을 추가하기로 하였다. 추가된 기능 스펙 정의는 아래와 같다. 한 명의 유저가 3분 동안 10번 잘못된 쿠폰 코드를 입력할 시에 10분 동안 쿠폰 코드 등록을 할 수 없다. 3분이 지났고 10번 미만으로 잘못 입력했다면, 잘못된 쿠폰 코드 입력 횟수에 상관없이 ...
사용자의 편의성을 위해 기존에 존재하던 결제방식에 네이버페이를 추가하는 잡을 맡게 되었다. 앞으로도 새로운 결제방식이 새롭게 추가될 가능성이 농후하고 새로운 결제 방식을 코드에 추가하면서 어떻게 하면 좀 더 가독성있고 확장성 있게 기능을 추가할 지를 고민하게 되었다.
Situation 사내 서비스중 현재 단일 서버, 중단배포 방식으로 배포가 이루어지는 서비스가 있다는 사실을 알게 됐고 이를 문제라고 생각해 서버 이중화 작업을 하기로 결정했다. 그 기록을 글로 남기고자 한다. 우선 단일 서버, 중단 배포 방식이 문제가 되는 이유는
Situation 슬렉 에러 체널을 보던 중, 504 Gateway Timeout이 지속적으로 발생하는 API가 있어서 무슨 문제가 있나 살펴보았다. 처음에는 GET속성의 API에서 조회 쿼리가 오래 걸려서 발생하겠거니 생각했지만 POST API에서 발생하는 문제였다.
I’ve decided to start writing about the improvements we made to the project’s queries. So, let’s kick off “Query Optimization Chronicles, Part 2”…!Aft
In our current Woowacourse project, we’ve been using the saveAll() method provided by Spring Data JPA. However, while incorporating user feedback, I r
To summarize the query improvements made in our ongoing project, I’ve decided to document the process. So, let’s kick off Query Optimization Chronicle
During a project, a major issue has arisen... It is.. imageThe issue occurs when the "Book Continuously" button is pressed repeatedly, causing the err
With the project's features nearing completion, it's finally time for refactoring. The topic of refactoring is "Improving Queries!"—a subject I've bee
I was curious about how Spring Boot manages threads, and through studying and applying this, I discovered many interesting facts. I wanted to document
I took on a task with adding Naver Pay to the existing payment methods to enhance user convenience. Given that new payment methods are likely to be ad
While working on a coupon project, a feature was added to prevent abuse when registering coupon codes within the app. The specifications for the new f