리팩토링 할 코드 POST /api/v1/comment 댓글을 작성한다. 댓글 작성 API의 비즈니스 로직을 위한 전제 조건은 다음과 같다. 1. Client에서 댓글 작성을 요청한다. 2. 댓글의 구조는 원댓글-대댓글을 구별하기 위해, Comment Entity는 원댓글에 대한 필드인 OriginalComment 라는 Comment 를 가진다. @Transactional public void create(CreateCommentRequest request) { Users user = getUser(request); Posts post = getPost(request); Comment originalComment = null; if (request.getOriginalCommentId() != null)..
기능 구현한 작업 브랜치에서 원격 브랜치에 rebase 후 push 하는 법git rebase 하고 push 하면 커밋 히스토리를 깔끔하게 관리할 수 있습니다. 진행 과정1. 변경사항을 커밋합니다.git add . git commit -m "feat:new feature" 2. 작업 중인 브랜치에서 나중에 최종으로 push할 원격 브랜치를 git rebase 합니다.git checkout git rebase release 3. git rebase 동안 충돌이 발생하면, 충돌을 해결하고 rebase를 계속 진행합니다.충돌이 발생한 파일을 편집하여 충돌을 해결합니다.git add . 또는 git add 을 사용하여 충돌이 해결된 파일을 스테이징합니다.git rebase --continue를 실행하여 reba..
Dependency Injection Inversion of Control 이라고도 하는 의존성 주입(Dependency Injection) 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 외부에서 주입 받아서 사용한다. 때문에 객체는 자신이 어떤 구체적인 클래스에 의존하는지 알 필요 없이, 주입 받은 인터페이스나 클래스를 사용할 수 있다. 의존성 주입에는 3가지 방법이 존재한다. 1. @Autowired 2. Setter 3. Constructor 생성자 주입 그 중 1. @Autowired 는 권장되지 않는 방법으로, 인텔리제이에서도 Field Injection is not Recommended 라고 경고를 띄워준다. Field Injection is not Recommended. 필드 ..
1. 스프링 컨테이너 생성 스프링 컨테이너가 생성되는 과정을 알아보자. // 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext 를 스프링 컨테이너라 한다. ApplicationContext 는 인터페이스다. 스프링 컨테이너는 XML 을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다. 직전에 AppConfig 를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다. 자바 설정 클래스를 기반으로 스프링 컨테이너(ApplicationContext)를 만들어보자. new A..
JwtTokenProvider 토큰 생성하고, 토큰을 복호화 해서 정보를 추출하고, 유효성을 검증하는 클래스입니다. jwt 토큰 구현 방식으로는 access Token, refresh Token 두가지 토큰을 사용하고, 인증 타입으로는 Bearer를 사용하였습니다. 최종 구현 코드 @Slf4j @Component // spring bean 등록 public class JwtTokenProvider { private final String key; private final Key jwtKey; private static final String BEARER_TYPE = "Bearer"; private static final String CLAIM_JWT_TYPE_KEY = "type"; private sta..
stream 의 map map 함수는 Java의 Stream API에서 제공하는 메소드, stream의 각 요소에 주어진 함수를 적용한 후 결과를 새로운 stream으로 반환한다. 기존에 있던 댓글을 가져와서 새로운 댓글로 업데이트 하는 과정을 의식의 흐름대로 작성해보니 이러했다. @Transactional public Comment update(Long commentId, CommentDto request) { // 변경하기전 댓글 객체 조회 Comment original = commentRepository.findById(commentId) .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_DOES_NOT_EXISTS)); Comment comm..
3주간 프로젝트를 마치고 회고록을 씁니다. 앞으로 남은 과제들이 많아서 해당 부분들은 차차 업데이트 할 예정입니다. 개발 배경 “네카라쿠배 개발자와 함께 Spring으로 인스타그램 서버 만들기” 라는 딥다이브(클론 코딩 챌린지) 에 참여하게 되었다. 챌린지의 주된 목표는 인스타그램 API 개발과 함께 1. Spring Security & JWT 사용 2. CI/CD 파이프라인을 구축하여 자동화 배포하는 것이다. 진행 중인 하루냥 프로젝트에서 Spring Security 에 대한 이해도 부족, 젠킨스 자동화 배포 구현 실패 경험으로 스스로 완성해보자는 목표가 있었다. 구현기간 23.03.24 ~ 23.04.13 (3주) 깨달은 점 강의로만 보던 스프링 시큐리티는 직접 구현하다보니 생각보다 더! 많이! 복잡..
1. 새로운 할인 정책 개발 “새로운 할인 정책을 확장해보자.” 👀 기획자 : 서비스 오픈 직전에, 할인 정책을 지금처럼 고정 금액 할인이 아니라 좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요. 예를들어, 기존 정책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데, 이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 20000원 주문시에 2000원 할인해주는 거에요! 💻 개발자 : 제가 처음부터 고정 금액 할인은 아니라고 했자나욧! 👀 기획자 : 애자일 소프트웨어 개발 선언 몰라요? “계획을 따르기보다 변화에 대응하기를” 💻 개발자 : ….(하지만 난 유연한 설계가 가능하도록 객체지향 설계 원칙을 준..
- Total
- Today
- Yesterday
- bucket4j
- spring boot 3
- QueryDSL
- Java
- redisson 분산락
- port
- array
- 오블완
- Linux
- MultipleBagFetchException
- dto 클래스 생성자
- addFilterBefore
- JPA
- Kotlin
- ChatGPT
- 티스토리챌린지
- Spring Security
- 배열
- FetchJoin
- Cannot construct instance of
- Git
- jvm warm-up 전략
- checkout
- 추상클래스
- 스프링 스케줄링
- 자바 어플리케이션 실행 과정
- n+1
- junit5
- 스프링오류
- MongoDB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |