목록리팩토링 (15)
개발놀이터
이번엔 HTTP Request 에서 강타입을 활용해 안정성을 높이는 방법에 대해 포스팅해보고자합니다. 스프링은 백엔드 서버로 주로 사용됩니다. 그래서 수많은 API들을 가지고 있고 그 API마다 프론트에서 원하는 포맷으로 데이터를 쏴주는 역할을 하죠. 보통 프론트엔드와 통신을 할 때 HTTP 통신을 사용하기 때문에 보통 회사에서 RESTful 하게 API를 만들고 Request를 json으로 받곤합니다. 이때! 자바의 강타입을 활용하면 큰 이득을 볼 수 있습니다. 이번 포스팅에선 강타입을 활용해 HTTP Request 를 안정적으로 받는 방법과 어노테이션을 이용해 Validation을 효과적으로 처리하는 방법까지 보너스로 알아보도록하죠! 시작은 늘 그렇듯 상황을 가정하고 들어갑니다. 이번엔 특별히..
이번엔 방법론에 대해서 포스팅해볼 생각입니다. 프로그래밍 언어는 크게 두가지로 나눌 수 있습니다. 바로 강타입 언어와 약타입 언어. 흔히 알려지기론 로우레벨, 하이레벨로 나누는 것과 일맥상통합니다. 강타입 언어는 타입이 딱딱 정해져있는 언어입니다. 자바나 C계열을 사용하신다면 int, String, long, boolean 이런 타입들이 익숙하실겁니다. 이렇게 딱딱 정해져있는 것이 바로 강타입 언어입니다. 강타입 언어에는 C, C++, C#, Java 정도가 있습니다. 물론 더 있지만 제가 아는 선에선 이거밖에... 약타입 언어는 타입이 런타임에 정해지는 언어입니다. 자바스크립트나 파이썬을 사용하신다면 익숙한 var 같은 타입이 바로 약타입입니다. 약타입 언어에는 자바스크립트, 파이썬, 코틀린 등이..
이번엔 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년전) 코드인 사이드 프로젝트의 코드들도 대대적으로 보기 깔끔한 코드로 변경하고 있습니다. 그러면서 문득 떠오르게 된 나만의 코딩 방식 "코딩 스탠다드" 를 정리하려고 합니다. 저는 제 포스팅을 남들이 많이많이 보는 것을 원하지 않습니다. "기억보다 기록을" 의 향로님처럼 많은 사람들이 보면 좋겠지만 저는 최대한 검색엔진에 노출되지 않게 포스팅을 작성하였습니다. 그 이유는 제가 눈에 띄는 것을 별로 안좋아하기도 하고 나중에 내사람들한테만 보여주면서 지식을 공유하는 것을 좋아합니다. 누군가는 농약을 헬기로 뿌려야할만큼 광활한 옥수수 농장을 운영하기도 하지만 조용히 시골에서 텃밭을 가꾸는 사람도 있으니까요. 저는 텃밭을 가꾸는 쪽입니다. 이 카테고..
이번 포스팅에선 제 프로젝트의 JWT 필터를 리팩토링 해보도록 하겠습니다. 우선 제 코드를 보여드릴텐데요. 정말 그지같지않을 수 없습니다. if else if else 몇번을 진행한건지 참... 한번 리팩토링 진행해보도록 하겠습니다. 클린 코드를 읽은 개념들을 바탕으로 리팩토링 해보겠습니다. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 1. Request Header 에서 JWT 토큰 추출 String token = resolveToken((HttpServletRequest) request); Authenticati..
이번 포스팅에선 책 클린코드에서 나온 예제인 switch문을 인터페이스, 추상클래스로 리팩토링 하는 방법에 대해서 포스팅해보도록 하겠습니다. 사실 책에서는 두루뭉실하게 얘기하기 때문에 조금 와닿지 않아서 개인적으로 토이프로젝트를 한번 만들어 봤습니다. 추상클래스와 인터페이스는 최근에서야 온전히 이해하기 시작해서 조금 미숙할 수 있습니다. public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSTION -> { return calculateCommisstionPay(e); } case HOURLY -> { return calculateHourlyPay(e); } case SALARIED -..
이번 포스팅은 함수입니다. 우리는 개발할 때 수십개 수백개도 더 함수를 만들어냅니다. 정작 함수가 어떻게 읽기 좋게 쓰여지는지는 별로 고민하지 않는 제 모습을 봤습니다. 여기서 로버트 C.마틴의 말을 인용하면서 시작해보겠습니다. "함수를 만드는 첫번째 방법은 작게 만드는 것이다. 그리고 두번째 방법은 더 작게 만드는 것이다. 함수는 100줄을 넘어서는 안된다. 아니! 20줄도 넘어서는 안된다!" -로버트 C.마틴 함수 한 가지만 해라 함수 하나가 버퍼도 처리하고, 페이지도 가져오고, 상속된 페이지를 검색하고, 경로를 렌더링하고, 문자열을 덧붙이고, HTML 파일을 생성하는 만능 함수를 한번쯤 만들어보셨을겁니다. 이에 로버트 C.마틴은 "함수는 한 가지를 해야하고, 그 한가지를 잘해야하며, 그 한가지만을 ..
우리는 이름을 정말 많이 짓습니다. 클래스, 변수, 인터페이스, 추상 클래스, JAR파일, WAR파일 모두 이름을 붙이게 됩니다. 그러므로 이름을 잘 붙이는 것은 의미있습니다. 그리고 잘 못지은 이름은 가독성을 떨어뜨리기 마련이죠. 이번 포스팅에선 의미있게 이름을 붙이는 방법에 대해서 설명해보도록 하겠습니다. 의미있는 이름 의도를 분명히 밝혀라 우리는 가끔 변수명을 이렇게 짓곤 합니다. int d; 하지만 개발할 때 당시만 기억나고 한참 뒤에 이 변수를 보면 무슨 변수인지 헷갈릴 때가 많습니다. 그러므로 우리는 아래와 같이 바꿔야합니다. int daysSinceModification; 이에 조금 연장선상의 코드들을 한번 보시죠. public List getThem() { List list1 = new A..