목록전체 글 (531)
개발놀이터
이번엔 for 문과 관련된 코딩 스탠다드입니다. StreamAPI에 대한 내용이기 때문에 관련된 개념을 숙지하고 계시면 좋습니다! https://coding-review.tistory.com/490 Java8 StreamAPIStreamAPI는 제가 자주 사용하는 문법 중 하나인데, 정작 뭐가 어떻게 동작하는지는 잘 모르고 썼던 것 같습니다. 그래서 정리하면서 사용법까지 훑어보도록 하겠습니다. StreamAPI란?자바8부터 지coding-review.tistory.com 왜 "StreamAPI로 처리할 수 있는 것만 StreamAPI로 처리해야" 하냐에 대해서 먼저 말씀드리겠습니다. StreamAPI를 쓰면 확실히 코드가 간드러지긴합니다. 들여쓰기도 없고 한줄에 집약해서 숏코딩할 수 있는게 정말 ..
이번엔 Optional을 활용해 null 체크를 하는 코딩 스탠다드에 대해서 포스팅해볼까합니다. Optional에 대한 더 자세한 내용은 망나니개발자님 포스팅을 참고해주세요! 아래의 포스팅이 Optional에 대해서 잘 설명이 되어있습니다. https://mangkyu.tistory.com/203 [Java] 언제 Optional을 사용해야 하는가? 올바른 Optional 사용법 가이드 - (2/2)앞선 포스팅에서는 Optional의 개념과 문법을 살펴보았습니다. Optional은 Null이 될 수 있는 객체를 감싸는 Wrapper 클래스이기 때문에 비용이 발생합니다. 그래서 Optional은 필요한 경우에만 사용하는mangkyu.tistory.com 우리는 상황을 하나 가정하고 Optional을 이..
제목 그대로 if 문의 조건이 길다면 함수로 빼는 것이 제 첫번째 코딩 스탠다드입니다. 상황) 만약 장바구니에 있는 상품 중에서 사이즈가 M인 상품을 2개 구매하려고 할 때 재고가 1개밖에 남지 않았다면 이를 막아야합니다. 우리는 다음과 같은 흐름을 따라갈 것입니다. 데이터베이스에서 나의 장바구니를 가져온다.장바구니 안에 상품의 사이즈가 M인지 체크한다.내가 고른 장바구니의 수량과 데이터베이스에 남아있는 수량을 비교한다. 만약 재고가 더 많이 남아있으면 결제를 진행한다. Bucket myBucket = bucketRepository.findByLoginId(loginId);String itemName = myBucket.getItem().getName()Item myItem = itemReposit..
요즘 클린코드에 빠져있습니다. 때문에, 오래된 (약 2년전) 코드인 사이드 프로젝트의 코드들도 대대적으로 보기 깔끔한 코드로 변경하고 있습니다. 그러면서 문득 떠오르게 된 나만의 코딩 방식 "코딩 스탠다드" 를 정리하려고 합니다. 저는 제 포스팅을 남들이 많이많이 보는 것을 원하지 않습니다. "기억보다 기록을" 의 향로님처럼 많은 사람들이 보면 좋겠지만 저는 최대한 검색엔진에 노출되지 않게 포스팅을 작성하였습니다. 그 이유는 제가 눈에 띄는 것을 별로 안좋아하기도 하고 나중에 내사람들한테만 보여주면서 지식을 공유하는 것을 좋아합니다. 누군가는 농약을 헬기로 뿌려야할만큼 광활한 옥수수 농장을 운영하기도 하지만 조용히 시골에서 텃밭을 가꾸는 사람도 있으니까요. 저는 텃밭을 가꾸는 쪽입니다. 이 카테고..
객체지향의 5대원칙 SOLID를 만들었다고 전해지는 로버트 C 마틴이 쓴 책 클린코드를 읽어봤습니다. 취업 준비때는 바빠서 취직하고는 책읽을 시간이 없어서 책 읽는 것을 소홀히했는데, 반성하며 읽다만 클린코드를 읽었습니다. 책에서는 객체지향을 위해 클린코드를 어떻게 작성해야하는지에 대한 가이드라인이 나와있습니다. 함수는 어떻게 작성해야 하는지, 주석은 어떻게 달아야하는지, 클래스는 어떻게 작성해야하는지 등등에 대한 내용이 들어있습니다. 그런데 저자가 표현을 좀 강력하게해서 일부 오해의 소지가 있는것 같습니다. 어떤 유튜버가 영상에서 클린코드를 무조건 맹신하면 안된다면서 "함수 하나에 하나의 책임만을 가지고 각각의 책임들을 함수로 빼야한다." 라는 말을 했는데 이를 오해한 사람들이 모든 함수를 다..
코드를 리팩토링 하는 과정에서 Collection에 담긴 내용을 if문 두개로 중첩해서 걸러내는 로직이 있었습니다. 로직을 간단하게 설명하자면 사용자가 장바구니에 담은 상품의 사이즈와 데이터베이스에 존재하는 상품의 사이즈 중 같은 것을 찾고 (ex. 장바구니에 105사이즈를 담았다면 데이터베이스에 105사이즈를 검사함) 찾은 것 중에 재고를 비교해서 장바구니에 선택한 수량이 데이터베이스에 남아있는 수량보다 많은 경우 (ex. 장바구니에 2개를 넣고 결제하려는데 데이터베이스엔 1개밖에 없는 경우) 를 비교해서 만약 그런 상황이라면 재고가 남아있지 않는다는 메시지를 띄워주기위해 설계한 로직입니다. 들여쓰기가 세번 이상 되었기 때문에 리팩토링 해야겠다고 생각했고 StreamAPI를 이용해서 깔끔하게 리팩..
StreamAPI는 제가 자주 사용하는 문법 중 하나인데, 정작 뭐가 어떻게 동작하는지는 잘 모르고 썼던 것 같습니다. 그래서 정리하면서 사용법까지 훑어보도록 하겠습니다. StreamAPI란?자바8부터 지원하게 된 StreamAPI는 Collection을 함수형 인터페이스를 이용해 함수형 프로그래밍을 지원하기위한 목적을 가지고 나왔습니다. 때문에 우리는 Collection 에 담겨있는 객체들을 이용해 for문을 돌리고 if문을 사용하는 것을 StreamAPI로 깔끔하게 줄일 수 있게 되었습니다. StreamAPI는 람다식을 이용해 함수형 프로그래밍을 지원합니다. 대부분 Collection에 stream() 을 붙여서 사용합니다. 예시 코드와 함께 보시죠. List findBucket..
오늘도 사이드 프로젝트를 리팩토링하면서 시간을 보내고 있었습니다. 얼마전 if-else 블록의 중복으로인해 추상화하는 방법을 깨달아서 이 방법으로 추상화를 진행했습니다. 그 결과 이렇게 코드를 줄일 수 있었죠. 이랬던 코드들이 이렇게 바뀌었습니다. https://coding-review.tistory.com/487 다형성을 이용해 if else 블럭 추상화하기취준때 개발했던 온라인쇼핑몰 프로젝트는 약 2년전에 개발한만큼 돌아가게만 만든 경향이 있는 코드들입니다. 읽기 힘든 코드는 물론이고 확장성을 고려하지않은 구조가 많았습니다. 제 프로coding-review.tistory.com 리팩토링 방법은 위의 링크와 같은 방식으로 처리했습니다. 리팩토링으로 SRP와 OCP를 동시에 지킬 수 있게 되었..
취준때 개발했던 온라인쇼핑몰 프로젝트는 약 2년전에 개발한만큼 돌아가게만 만든 경향이 있는 코드들입니다. 읽기 힘든 코드는 물론이고 확장성을 고려하지않은 구조가 많았습니다. 제 프로젝트에서 문제가 된 부분을 단순화해서 보여드리고 어떻게 리팩토링 하였는지 포스팅해보려고합니다. if else 블럭을 추상화? 한번 이런 상황을 가정해보도록 하겠습니다. 우리 프로젝트는 관리자 (ADMIN), 매니저 (MANAGER), 일반회원 (MEMBER)에 따라 할인이나 결제에 대한 정책이 다르게 설정되어있습니다. 때문에, 할인정책에서도 관리자, 매니저, 일반회원인지를 확인하고 정책을 적용해야하고 결제정책 또한 마찬가지입니다. 그 결과 제 코드는 이런 방식으로 짜게되었습니다. @Service public class Paym..
이번에 눈에 들어온 그지같은 코드는 바로 이중 for문입니다. 우선 리팩토링 전 코드부터 보시죠. package com.hello.capston.service; import com.hello.capston.entity.*; import com.hello.capston.repository.ItemDetailRepository; import com.hello.capston.repository.OrderItemRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.hibernate.TransactionException; import org.springframework.security.core.p..