🚩 1. 들어가며... Spring Data JPA를 사용하는 환경에서 여러 개의 데이터 삽입을 위해 saveAll() 메소드를 실행시키면, N개의 데이터마다 N개의 Insert쿼리를 날린다. 이렇게 되면 데이터베이스의 성능이 매우 떨어지게 되는데, 이런 문제를 해결하기 위해 Bulk Insert를 구현하게 되는데 이 과정에서 발생한 문제와 해결 방법을 포스팅한다. 🚩 2. 문제 상황: N개의 데이터 만큼 N개의 Insert Query를 날리는 saveAll() 여러 개의 데이터를 저장할 때 사용하는 saveAll() 메소드는 마치 Bulk(Multi Row) Insert로 동작할 것 같지만, 사실은 그렇지 않다. 만약 하나의 상품에 여러 개의 이미지를 저장한다고 할 때 saveAll() 메소드는 이미지..
🚩 1. 이번 달의 주요 사건 📌 1-1. SQLD 시험 한 방에 합격하다! 지난 11월에 응시했던 SQLD 시험 결과가 나왔고, 1과목 만점과 함께 안정적인 점수로 합격했다. 지난 번에 1과목은 좋은 점수가 기대된다고 했는데 만점을 받았고 불안했던 2과목은 예상했던 것 보다 괜찮은 점수가 나와서 너무 기쁘다! 이번 회차가 어렵고 헷갈리는 지문이 많았다고 하는데 정말 다행이다🤩 공부 목적으로 도전한 시험인데, 개인 프로젝트를 하면서 ERD를 짜고 있는 지금! 확실히 도움이 많이 됐다고 느낀다. 이렇게 결과까지 얻어가니 보람차고 속이 후련하다. 그래도 SQL은 계속해서 써보고 공부할 예정이다. 📌 1-2. 코딩테스트 흥미를 느끼다. 이번 달 목표로 코테 문제를 풀고 30개 기록하기가 있었는데 아슬아슬하게 ..
🚩 1. 들어가며... 개인프로젝트를 진행하며 한 번도 해보지 않았던 배포와 관련 간단한 인프라를 구축해보았다. 배포를 위한 EC2 인스턴스 생성 후 EC2에 Redis Server 설치와 가비아에서 구입한 도메인 연결, 그리고 80포트 요청 8080포트로 포워딩하는 과정을 2편에 나눠 각종 에러에 대한 해결법을 기록할 겸 포스팅할 예정인데, 먼저 1편은 EC2 인스턴스 생성과 빌드 그리고 Redis설치하는 것을 포스팅할 것이다. 🚩 2. AWS EC2(Elastic Compute Cloud) 생성과 접속 아마존 웹 서비스에서 제공하는 클라우드 기반 컴퓨팅 서비스 사용자의 필요에 맞게 가상 서버를 생성/관리(확장, 축소) 가능 사용자가 선택한 가상 머신 유형과 스토리지 유형에 따라 비용 부과 📌 2-1...
🚩 1. 들어가며... 오늘 한 'U'회사에 면접을 보고 왔다. 빌드 도구인 Gradle(이하 그레이들)의 의존성 옵션에 대한 질문에 답변을 하지 못했다. 그동안 스프링 부트 스타터가 내가 선택한 라이브러리 의존성들을 너무 잘 구성해주었던 탓인지 신경쓰지 못한 부분이었다. 그래서 그레이들을 공부해보고자 포스팅을 시작한다. 🚩 2. Gradle이란? DSL(Domain-SpecificLanguage) Groovy나 Kotlin을 기반으로 한 DSL(Domain-SpecificLanguage)을 사용하여 빌드 스크립트를 작성하는 빌드 툴이다. XML 문법보다 가독성이 좋고 간결하다. 빌드 캐싱 빌드 작업을 캐싱하여 반복 빌드 시간을 크게 단축시킬 수 있다. 불필요한 빌드 작업을 피하고 빠른 개발 사이클 제공..
🚩 1. 들어가며... 개인 프로젝트에서 회원가입 기능을 구현하면서 SMS문자 인증 기능을 도입하였다. 처음에는 문자 인증에 필요한 인증 번호를 세션에 저장하는 방식에서 레디스를 활용하여 저장한 후 인증하는 방식으로 변경했다. 왜 이런 판단을 하였는지, 세션 저장의 단점과 레디스 저장의 장점에 대해서 포스팅할 것이다. 🚩 2. 세션으로 인증 번호 관리하기(개선 전) @PostMapping("/send-certification-cod") @ResponseBody public String sendCertificationCode(@RequestParam String tel, HttpSession session) { String certificationCode = generateCertificationCode(..
🚩 1. 이번 달의 주요 사건 📌 1-1. SQLD 시험 응시 지난 10월 말, SQL공부겸 응시했던 SQLD 자격 시험을 드디어 치뤘다. 1과목 모델링과 2과목 SQL부분이 있었는데, 1과목은 좋은 점수가 기대된다. 하지만 2과목은 내가 문제를 괜히 한 번 더 꼬아 생각해버리는 바람에 틀린 문제도 있었다. 학창시절 때부터 가지고 있었던 버릇이다. 내가 아는 내용으로는 이게 맞다고 생각하면서도 혹시 내가 모르는 부분이 있나? 하면서 또 의심하는 버릇 때문인 것 같다. 좋게 생각하면 깊게 파고들어 스스로 학습하게 만드는 에너지의 발원지이기도 하지만 이렇게 부작용도 따른다. 양날의 검인 것 같다🥲 12월 8일에 사전 점수 공개인데 시험을 마치고 "점수 공개까지 어떻게 기다리냐..."라고 생각했다. 이글을 쓰..
🚩 1. 들어가며... Spring Data JPA를 사용하며 개인 프로젝트를 진행하고 있던 중 유저 계정의 활성화 여부를 별도로 값을 주지 않아도 기본값(true = '1')이 삽입되도록 데이터베이스에서 DEFAULT 값을 세팅해주었다. 이러한 과정에서 발생한 문제와 해결방법과 함께 포스팅한다. 🚩 2. 문제 상황 - 기본형 boolean과 데이터베이스 기본값 데이터 베이스의 DDL에서 'is_enabled' 컬럼을 tinyint NOT NULL DEFAULT '1'로 설정했다. 설정의 목적은 해당 엔티티의 필드에 값이 명시적으로 초기화 되지 않고, 쿼리에 포함되지 않는다면(null이 할당되는 것과는 다르다.) 데이터베이스가 자동으로 true = '1'을 기본값으로 사용할 수 있도록 하는 것이다. 하지..
🚩 1. 들어가며... JPA Spring Date를 공부할 목적으로 개인 프로젝트를 진행하며 Entity클래스를 구현하고 있던 중 Lombok 라이브러리의 @AllArgsConstructor의 문제점과 @Setter를 지양해야 한다는 것을 알게 되었다. 따라서 '@AllArgsConstructor', '@Setter'이 두 어노테이션을 사용하지 않고 Entity객체를 만들고 @ToString 사용시에도 순환 참조에 유의하여 사용하는 방법에 대해서 포스팅할 것이다. 🚩 2. @AllArgsConstructor, @Setter 사용을 지양하고 @Builder를 도입하기 📌 2-1 기존 코드 @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor @..
🚩 1. 스프링의 빈(Bean)은 무상태로 설계하자! 스프링 프레임워크에서 빈은 주로 싱글톤(SingleTone)으로 관리되는 객체를 말한다. 빈은 여러 요청에 걸쳐 공유되므로 상태를 가지게 되면 여러 문제점이 발생할 수 있다. 따라서 빈을 설계할 때는 무상태(StateLess)로 설계하는 것이 좋다. 📌 1-1. 무상태로 설계해야 하는 영역 자바의 빈으로 등록되는 객체 Controller, Service, Mapper/DAO, Repository 이러한 계층의 객체(클래스)는 여러 요청에 걸쳐 공유되므로 상태를 가지지 않도록 하는 것이 좋다. 여러 요청 간에 공유되는 객체 동시에 여러 사용자가 액세스할 수 있는 객체는 상태를 가지지 않는 것이 좋다. 상태를 가지게 되면 상태의 일관성을 유지하기 어려워 ..
🚩 1. SOILD 원칙이란? SOLID원칙이란 객체 지향 프로그래밍과 설계에 있어서 중요한 디자인 원칙 다섯 가지를 의미한다. 이 원칙들은 코드의 재사용성, 확장성을 높여 개발의 생산성을 높이는 데 도움을 준다. 🚩 2. 5가지 SOLID 원칙 📌 2-1. 단일 책임 원칙(SRP) 한 클래스는 하나의 책임만 가져야 한다. 이는 클래스를 수정할 이유가 오직 하나뿐이어야 함을 의미한다. 변경이 있을 때 파급효과가 적을 수록 단일 책임 원을 잘 따른 것이다. 이를 통해 코드의 유지보수성을 높일 수 있다. 📌 2-2. 개방-폐쇄 원칙(OCP) 소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀있어야 한다. 이 원칙은 기존 코드를 건드리지 않고 새로운 기능을 추가할 수 있어야 한다. 다형성을 활용한다. 인터페이스..