[개발 일기] 2025.03.23 - 무중단 배포
·
개발 일기
💡 개요 현업에서 사용되는 무중단 배포 기술을 크게 세 가지 있다.  오늘은 해당 기술에 대해 정리해 보자.  📕 무중단 배포 무중단 배포란 말 그대로 중단 없이 배포하는 것이다.  우리가 만약 단일 Spring 서버를 배포하기 위해선 이 서버는 어쩔 수 없이 잠깐 종료되어야 한다.  왜냐하면 재시작을 해야 하기 때문이다.  그렇기 때문에 재시작을 할 때 동안은 서비스를 이용하지 못한다.  만약 서비스가 총 10개의 Spring 서버를 이용하는데, 동시에 재시작하려면?  시간도 오래 걸리고, 그만큼 클라이언트는 서비스를 사용하지 못하는 상황이 발생한다.  이러한 상황을 해결하기 위해 무중단 배포라는 것이 나오게 되었다.   🛠️ Canary 배포  이전 버전인 v1 서버가 있고, 배포해야 할 새로운..
[개발 일기] 2025.03.22 - 스케줄링 기법
·
개발 일기
💡 개요 오늘은 각 프로세스마다 CPU를 할당받는 기법인 스케줄링 기법에 대해 정리해 보자.   📕 스케줄링 기법 스케줄링은 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법이다.  쉽게 말하면, 현재 대기 중인 프로세스들 중에서 어떤 프로세스가 실행될지를 결정하는 기술이다.  하나의 컴퓨터에서는 여러 프로세스가 동시에 실행될 수 있는데, 만약 사용자가 여러 프로세스를 동시에 실행하려 한다면, CPU는 어떤 프로세스를 먼저 실행할지 결정하거나, 현재 실행 중인 프로세스를 잠시 멈추고 새로 들어온 프로세스를 우선 실행할 수도 있다.  이렇게 스케줄링은 비선점형 스케줄링과 선점형 스케줄링으로 나뉜다.   🛠️ 비선점형 스케줄링 비선점형 스케줄링은 말 그대로 선점당하지 않은 것을 뜻한다.  만약 한 ..
[개발 일기] 2025.03.21 - 외부에서의 주입이 테스트 코드에 용이한 이유
·
개발 일기
💡 개요 많은 개발 서적에서 공통적으로 설명하는 개념이 있다.  외부에서 인자나 의존을 주입하면 테스트 코드를 작성할 때 더 편하다!  왜 그럴까? 한번 정리해 보자.   📕 외부 주입과 테스트 코드의 관계 🚫 내부에서 직접 객체를 생성하는 경우 내부에서 직접 객체를 생성하면 해당 객체가 다른 객체와 강하게 결합된다. 즉, 특정 구현 방식에 종속되며 테스트가 어려워진다.  또한, 테스트 코드를 작성할 때 우리는 성공하는 케이스뿐만 아니라 실패하는 케이스도 고려해야 한다.  하지만 내부에서 객체를 직접 생성하면 해당 객체는 일반적으로 성공하는 데이터를 기준으로 설계되기 때문에, 실패하는 케이스를 만들기가 어렵다.  ✅ 외부에서 의존성을 주입하는 경우 반면, 외부에서 의존성을 주입하면 테스트 대상만 따..
[개발 일기] 2025.03.20 - 에러 로그를 찍어도 되나? (Feat : 시큐어 코딩)
·
개발 일기
💡 개요 OKKY에선 예외가 발생하면 해당 예외에 대한 로그를 찍으면 되냐 안 되냐 시큐어 코딩 위반이냐 아니냐에 대해 이야기하는 것을 봤다.  오늘은 에러 로그를 찍는게 맞는지 아닌지 정리해 보자.   📕 시큐어 코딩 시큐어 코딩이란 ‘사용자가 입력한 데이터는 신뢰할 수 있는 데이터가 아니다’라는 전제를 기반으로 코드를 작성하는 것이다.  🛠️ 시큐어 코딩 점검 항목 입력 데이터 검증 및 표현사용자의 입력값을 검증하여 SQL Injection, XSS, CSRF을 방지한다.예: 사용자 입력값을 검증하고, SQL 쿼리 실행 전에 바인딩 처리하여 실행보안 기능인증, 접근 제어, 암호화 등을 적절히 적용하여 보안 기능을 강화해야 한다.예: 비밀번호를 평문으로 저장하지 않고, 해시 함수(예: bcrypt..
[개발 일기] 2025.03.19 - @Valid
·
개발 일기
💡 개요 Spring에서 값 검증에 자주 사용되는 @Valid는 어떨 때 사용하는 것일까?   📕 @Valid 난 보통 DDD 패턴에서 엔티티의 Value Object를 사용하기 때문에 해당 객체 내부에서 값 검증을 하는 경우가 많다.  하지만 Value Object는 주로 엔티티와 함께 사용되고, 데이터베이스에 접근하기 전 단계에서 활용된다.  이때 클라이언트의 요청은 Controller → Service → Repository 흐름으로 진행되는데, 만약 잘못된 값이 들어오면 최종적으로 Repository 단의 직전에 검증 오류가 발생한다.  서버 입장에서는 잘못된 데이터가 최대한 빨리 차단되는 것이 효율적이기 때문에, 가능한 앞단에서 검증을 수행하는 것이 좋다.  이때 사용하는 것이 @Valid ..
[개발 일기] 2025.03.18 - MultipartFile와 Setter의 관계
·
개발 일기
💡 개요 MultipartFile을 Controller에서 받기 위해선 Setter가 필요하다.  @Setterpublic class ProductRegisterRequest { private String productName; private String productContent; private int price; private MultipartFile file; ...} @RestController@RequiredArgsConstructor@RequestMapping("/api/v1/products")public class ProductController { private final ProductService productService; @PostMapping(..