문제 상황 같은 형태의 테이블 2개를 하나의 테이블로 합쳤을 때, Auto Increment 때문에 생길 수 있는 문제에 대해서 정리를 해보려고 합니다 편의를 위해서 정말 간단한 엔티티로 설명을 드리도록 하겠습니다 @NoArgsConstructor @AllArgsConstructor @Getter @Entity @Table(name = "transaction_data") public class TransactionData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; public TransactionData(String name) { thi..
안녕하세요 카페인팀 nunu입니다. 오늘은 스프링에서 발생한 에러 로그를 슬랙으로 모니터링하는 방법에 대해서 알아보려고 합니다. 목차는 다음과 같습니다. 스프링에서 로그를 남기는 방법 Slf4 j의 동작원리 Logback의 동작원리 Logback을 사용해서 슬랙으로 에러 로그를 모니터링하는 방법 스프링에서 로그는 어떻게 찍을까? 스프링에서 로그를 찍는 방법은 여러 가지가 있지만, 가장 간단한 방법은 System.out.println()을 사용하는 것입니다. @RestController public class TestController { @GetMapping("/test") public String test() { System.out.println("test"); return "test"; } } 당연하..
안녕하세요 우아한테크코스 카페인팀 누누입니다 이번에는 대량의 데이터를 DB에 넣는 과정을 최적화하는 과정에서 알게 된 내용을 공유하려고 합니다 이번 최적화의 목표 전기차 충전소에 대한 공공 데이터를 가져오고, 그 데이터를 DB 에 넣는 과정을 최적화해보자 대량의 데이터를 삽입하는 과정 저희 팀의 요구사항을 간단하게 정리하면 다음과 같습니다 대량의 데이터를 공공 데이터에서 전기차 충전소와 전기차 충전기에 대한 데이터를 가져온다 충전소는 6만 개, 충전기는 23만 개의 데이터가 존재한다. 한 번에 가져올 수 있는 양은 9999개 까지다. 이 데이터를 DB에 넣는다 충전소와 충전기는 1:N 관계이다 최적화 전은 어떤 상황이었는데? 위 사진을 잘 보시면 아실 수 있으시겠지만, 2000개를 저장하는데, 231.7..
왜 리팩터링을 시작했을까? 우아한테크코스 과정을 진행하면서 간단한 애프리케이션은 많이 사용해 봤지만, 모두 너무 작은 규모의 프로젝트였는데요 짧다면 짧고, 길다면 긴 기간동안 작성했던 프로젝트를 과거 코드부터 출발해서 변경해 나가는 과정을 직접 겪어보고 싶었습니다 이 프로젝트를 선택하게 된 이유는 외부 API 호출 기능이 많았기에, 테스트를 하기 위해서는 필수적으로 추상화나, 모킹이 들어가야 했습니다. 이때 잘 설계를 하게 된다면 추상화의 장점을 정확하게 볼 수 있다고 생각했는데요 기존 프로젝트에는 어떤 기능이 있을까? 1. GPT 를 통해서 꼬리질문을 만들어주는 기능 2. 가입을 하는 과정에서 이메일 인증을 하는 기능 3. 닉네임을 외부 api를 통해서 가져오는 기능 4. Security 로 로그인 관..