목록스프링 (25)
Kuma's Curious Paradise
1. 왜 @JsonFormat, @JsonCreator, @JsonProperty이 필요할까?스프링으로 웹 개발을 하면 spring-boot-starter-web 의존성을 추가해야 한다. implementation 'org.springframework.boot:spring-boot-starter-web' 이 의존성에는 웹 개발에 필요한 기본 구성 요소들이 모두 포함되어 있는데,그중에서도 아주 중요한 요소가 바로 Jackson이다. Jackson은 기본적으로 다음의 일을 수행한다. Java → JSON: 직렬화 (serialize)JSON → Java: 역직렬화 (deserialize)하지만 Java의 모든 구조가 JSON에 딱 들어맞는 것은 아니다. 특히 날짜 변환이 그렇고, jackson에서 객체의 ..
1. 자바의 어노테이션과 스프링의 어노테이션어노테이션은 @ 기호로 시작하는 메타데이터로, 클래스나 메서드 위에 붙이면 어떤 의미나 동작을 추가로 부여한다. 예를 들어,@Deprecated는 “이거 이제 쓰지 마세요”라고 경고한다. @Autowired는 “스프링 씨, 이 클래스 빈으로 만들어서 자동 주입해주세요”라는 뜻이다. 자바에는 기본적으로 제공하는 어노테이션들이 있다.JDK에서 자체 작동하는 어노테이션들이다.예를 들면 : - @Override - @Deprecated - @FunctionalInterface이런 어노테이션들은 컴파일러가 인식/처리하지만(override한 메서드의 이름이 다른지 확인하는 등), 실행 중에 무슨 동작을 하진 않는다. 스프링은 좀더 발전된 어노테이션 체계를 추구한다. 어..
최근 프로젝트에서 아래와 같은 Lombok 어노테이션이 붙은 코드를 발견했다.아래는 해당 코드를 단순화한 예시다. (말이 안 될 수 있으니... 예시로만 봐 주면 좋겠다.)@EqualsAndHashCode(of = {"bookId", "bookPriceId"})public class BookCover { private Long bookCoverId; private Long bookId; private Long bookPriceId; private int price; public BookCover(Long bookId, Long bookPriceId) { this.bookId = bookId; this.bookPriceId = bookPriceId; ..

아이북조아에서는 '좋아요&싫어요'와 같은 피드백을 하면 회원의 성향(MBTI)이 바뀐다. 해당 변화는 피드백을 한 도서의 성향(MBTI)에 영향을 받는다. 이를 위한 배치 Job은 다음과 같이 진행된다. Job: syncFeedbackAndUpdateTraitsJobStep: Step1 : syncFeedbackStep - redis에 임시 저장되어 있던 좋아요/싫어요를 mysql로 이관한다 Step2 : updateTraitsChange - mysql에서 step1의 결과를 읽어와 점수 변화를 계산하고 TraitsChange 테이블을 업데이트한다 Step3 : updateChildTraits - 갱신된 TraitsChange 테이블을 읽어 점수가 5 이상이면 ChildTraits에 새로운 레..

유레카가 끝나고 나서야 회고를 몰아서 쓴다.멍티비티는 LG 유플러스 유레카 백엔드 비대면 '최종 융합' 프로젝트로, 아이북조아와 마찬가지로 좋은 성과를 낼 수 있었다. (상장이 너무 으리으리해 보여서 좀 부끄럽지만...) 프론트엔드 4명 & 백엔드 4명이 진행하였으며, https://mungtivity.vercel.app/ 에서 이용해 볼 수 있다. 사진은 옹기종기 9조 친구들... 내가 선 자리에 빔프로젝터 불빛이 너무 세게 비쳐 차마 눈을 뜨지 못했다는 후문... 관객들과 빛이 겹쳐 모든 분들이 하늘에서 내려오신 것처럼 성스럽게 보였다. 😅 멍티비티는 멍멍이 + 액티비티를 합친 이름으로, 강아지와 함께 액티비티를 즐기고 싶은 이들을 위한 '강아지 동반 시설 공유 플랫폼'이다. 따라서, 멍티비티를 ..

'아이북조아'는 LG 유플러스 유레카 백엔드 비대면 1기 교육과정을 수료하며 진행한 종합 프로젝트이다. 백엔드 팀원 6명이 모여 서버 사이드 렌더링으로 웹사이트를 구축하였고, 다음과 같은 좋은 성과가 있었다. 이제 발표 자료 일부를 살펴보며, 프로젝트 회고를 진행해 보려 한다. 이번 프로젝트의 잘한 점페어 프로그래밍 진행 (의사소통과 협업 능력 함양)애자일한 프로젝트 관리 (Jira, Slack, Github, Canva 등)확실한 성능 테스트 및 테스트 코드 작성이후 DB 관련하여 추가 테스트 및 조사 실시먼저 페어 프로그래밍 진행이다. '아이북조아'는 2명&2명&2명 || 3명&3명 페어 프로그래밍으로 개발을 진행했다. 페어 프로그래밍은 함께 코드 방향을 의논한 뒤에, 각자가 역할을 맡아 ..

위 두 테이블은 같은 ‘좋아요’ 테이블이다.다른 점은 feedback 테이블은 복합키로 구성되어 있고, rec_book_like 테이블은 그렇지 않다는 것. 이 둘은 각기 다른 pk와 fk, 그리고 인덱스를 지닌다. [feedback 테이블]PK는 book_id와 child_id 모두를 합한 형태. 예를 들면, (1,2) 형태로 키를 지닌다. → mysql에서는 primary 키가 설정된 순서대로 컬럼을 정렬하기 때문에, book_id를 기준으로 먼저 정렬한 다음, child_id 순으로 정렬된다.FK는 book_id와 child_id를 지닌다.index는 (book_id, child_id)와 (child_id)를 지닌다.book_id에는 index가 걸려 있지 않음을 알 수 있다. → 이는(첫 번째 정..

유레카 미니 프로젝트2 발표 도중 캐시로 성능이 얼마나 향상되었냐는 질문을 받았다. 그럼 jmeter로 확인해보면 되지! 일단 캐시가 적용된 상태를 체크해보자! 하던 도중… 예상치 못한 상황을 만났다.문제1 : 캐시가 제대로 적용되지 않았다아래는 테스트 설정이다. 500개의 스레드가 60초 동안 차례로 들어온다. 각 스레드들은 200초까지 유지된다.캐시를 적용한 채 getRanking을 테스트해 보았다. 시간이 좀 지나자 에러가 터지고… 서버가 마비되기 시작했다. 117,078: 117,078개의 요청이 처리되었다. 이는 캐시 적용 시 서버가 처리한 전체 요청 수를 의미한다.676 ms: 평균 응답 시간. 이는 각 요청에 대해 서버가 응답하는 데 걸린 평균 시간을 나타낸다. 캐시 적용 시 응답 시간이 얼..

1. AOP 적용하기1-1. aop란 무엇인가?애플리케이션의 핵심 로직에 영향을 주지 않으면서, 공통적인 기능(예: 로깅, 트랜잭션 관리, 보안)을 코드의 다른 부분에 쉽게 적용할 수 있도록 하는 프로그래밍 패러다임 1-2. 핵심 개념Aspect: 횡단 관심사(로깅, 보안 등)를 모듈화한 객체. 여러 모듈에 공통으로 적용되는 기능.JoinPoint: AOP에서 적용할 수 있는 시점(예: 메서드 호출, 예외 처리 등). 어디서 끼어들까?Advice: Aspect가 적용될 구체적인 동작(예: 메서드 실행 전, 후에 실행할 동작). 뭘 할까?Pointcut: Advice를 적용할 지점을 정의하는 표현식. 메서드 실행 전? 후? 지정하기1-3. interceptor, filter와의 차이점은 무엇인가?AOP, ..
프로젝트에서 토스 결제 API와 같은 외부 API를 활용하는 경우, 테스트 코드를 어떻게 작성해야 할까? 구글링해 본 결과, 프론트 코드를 만들어 호출 및 실행을 확인하는 경우가 많은 듯했다. 하지만 이것만으로는 충분하지 않다. 이들은 프로젝트 내 다른 비즈니스 로직과 얽혀 있는 경우가 많기 때문에 이러한 로직들까지도 테스트할 필요가 있었다. 따라서 오늘은 토스 결제 API를 중심으로 외부 API와 함께 비즈니스 로직이 포함된 테스트 코드를 작성해 본 경험을 적어보고자 한다. 이제부터 소개할 테스트 코드는 실제 외부 API를 호출하는 '통합 테스트'가 아니다. API의 응답을 모킹하여, '~~~하게 응답했다 치고' 작성하는 'MockMvcTest'임을 미리 밝힌다. 1. 테스트해야 할 코드@RestC..