모르지 않다는 것은 아는것과 다르다.

전체 글 224

클린코드 4장 (주석)

주석은 나쁜 코드를 보완하지 못한다. 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 모듈을 짜고 보니 알아보기 어렵다면 주석을 다는 것이아니라 알아보기 쉽게 다시 코드를 정리해야 한다. 코드로 의도를 표현하라 주석으로 코드를 설명하기 전에 코드만으로 의미를 포함할 수 있는 방법이 없는지 생각해봐야한다. //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if((employee.flags & HOURLY_FLAG) && (employee.age>65)) 위와 같은 코드는 아래와 같이 바꿀 수 있다. if(employee.isEligibleForFullBenefits()) 위의 코드를 보면 충분히 의도를 파악할 수 있다. 좋은 주석 법적인 주석 법적인 이유로 특정 주석을 넣으라고 ..

Books 2022.04.23

클래스 다이어그램

클래스 다이어그램 대표적인 UML 구조 다이어그램이다. 객체 지향 프로그래밍에서 여러 클래스 상호관의 혐력 관계를 나타내는 다이어그램이다. 클래스 간의 관계를 설계 할때 유용하다. 가장 윗부분이 클래스 이름이다. 메소드와 비슷하게 괄호가 붙은 것이 연산이다. 변수명 처럼 나타난 것이 속성이다. 이텔릭체로 되어있는 것은 추상클래스나 인터페이스를 의미한다. (메소드도 마찬가지다) 스테레오 타입으로 표현하기도 한다. (, ) 다이어몬드 포살표가 되었다는 의미는 의존관계를 나타내는데, 위와 같은 경우는 Decorator 클래스가 Component 형 변수를 component 라는 이름으로 가지고 있다는 것을 의미한다. 접근 제어자 표시 public : + protected: * default: ~ private..

객체지향 2022.04.23

클린코드 3장 (함수)

작게 만들어라 함수를 만드는 첫째 규칙은 작게만드는 것이다. 함수가 작을수록 한눈에 파악하기 쉽기 때문이다. 한 가지만 해라 함수는 한 가지를 해야한다. 하지만 그 한 가지를 잘 해야한다. 함수가 여러 기능을 하게된다면 테스트하는것도 복잡해 진다. 함수 당 하나의 추상화 수준만을 가져야한다. 함수 내 모든 문장의 추상화 수준이 동일해야한다. 추상화 수준을 맞추지 않으면 특정 표현이 근본 개념인지 아니면 세부사항인지 구분하기 어렵기 때문이다. 내려가기 규칙을 사용하면 추상화 수준을 맞추기 좋다. 내려가기 규칙을 사용하면 코드를 위에서 아래로 이야기 처럼 읽기 쉽게 코드를 작성할 수 있다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다. Switch 문 switch 문은 작게 만드는 것이 어렵다..

Books 2022.04.17

클린코드 1장, 2장

1장 깨끗한 코드 C++ 창시자이자 C++ Programming Language 저자 Bjarne Stroustrup 나는 우아하고 효율적인 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉬워진다. 오류는 명백한 전략에 의거해 철저히 처리한다. 성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 깨끗한 코드는 한 가지를 제대로 한다. Object Oriented Analysis and Design with Application 저자 Grady Booch 깨끗한 코드는 단순하고 직접적이다. 깨끗한 코드는 결코 설계자의 의도를 숨기지 않는다. 오히려 명백한 추상화와 단순한 제어문으로 가득하다. OTI 창립자이자 이클립스 ..

Books 2022.04.17

MapStruct

MapStruct Layer 간의 객체 변환 로직은 개발자가 직접 구현해도 되지만, 반복적이고 불필요한 코드가 많아지고, 단순한 실수로 인한 개발 생산성이 떨어지게 된다. 이를 위해 많이 사용하는 매핑 라이브러리로 ModelMapper 가 있는데, MapStruct 를 사용하면 ModelMapper 와 비교해서 몇몇 장점을 가지고 있다. MapStruct vs ModelMapper ModelMapper 는 리플렉션 기반으로 동작하여 실제 매핑 로직을 쉽게 파악하기 어렵다. MapStruct 는 코드 생성 방식으로 동작하기 때문에 생성된 코드를 통해 로직을 쉽게 파악할 수 있다. 생성된 코드를 눈으로 보며 디버깅이 가능해서 로직 분석도 가능하고 수정도 가능하다. MapStruct 는 컴파일 타임에 매핑 오..

Spring 2022.04.09

Handler Methods

@RequestMapping @RequestMapping( name = "nameForView", // 뷰 템플릿에서 찾는 이름 value = "/places", // URI 경로 path = "/places", // URI 경로 method = RequestMethod.GET, // Get 방식 params = "test=true", // test=true 파라미터 있는 요청 headers = "header-auth=stupidPassword", // header-auth 헤더값 있는 요청 consumes = MediaType.APPLICATION_JSON_VALUE, // json 으로 데이터 주는 요청 produces = MediaType.APPLICATION_JSON_VALUE // json 데이..

Spring 2022.04.09

Retrofit

Retrofit 란? Retrofit 은 Java 에서 REST Client 를 간편하게 구현할 수 있도록 기능을 제공하는 라이브러리이다. Spring Web 에서 제공하는 RestTemplate 도 이와 동일한 기능을 제공하지만, Retrofit 을 사용할 때가 코드 가독성과 편의성이 좀더 높다. Retrofit 은 Annotation 과 Interface 로 선언된 HTTP API 명세를 기반으로 HTTP API 구현체를 생성해준다. Retrofit 은 HTTP API 의 요청과 응답에서 타입을 강제하여 Type Safe 한 장점을 제공한다. 타입이 강제되기 때문에 개발 과정에서 요청과 응답에 대한 예측이 가능하다. 의존성 추가 implementation 'com.squareup.retrofit2:r..

Spring Cloud 2022.04.09

SpringBatch Test

Spring Batch Job 아래와 같이 Job 을 구현했다고 했을때, 아래의 코드를 테스트해보려고 한다. 아래의 Job 은 AptNotificationRepository 에서 Apt 의 조건에 따라 메일로 공지를 보내는 Job 이다. @Configuration @RequiredArgsConstructor @Slf4j public class AptNotificationJobConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job aptNotificationJob(Step aptNotificationStep) { return job..

Junit 2022.04.02

ExecutionContext

ExecutionContext 란? Job에서 사용하는 데이터를 보관하는 보관소이다. Job처리를 통해서 언제나 참조 가능한 데이터를 보존하고, 추가 및 갱신도 가능하다. step처리의 결과 (결과값 등)를 다음 Step에 전달하는 것은 불가능하다. JobExecutionContext에 저장해서 어떤 step에서도 참조 가능하게 할 수 있다. Step 내 처리에서 데이터를 참조, 추가, 갱신이 자유롭게 가능하다. JobExecutonContext와 달리, 다른 step에서 참조가 불가능하다. 예를들어, chunk 처리에서 도중에 에러 종료로 끝난 경우 -> 어디까지 데이터를 읽어 들어드렸는지를 stepExecutionContext에 보관한다. -> 실패했던 곳에서부터 처리를 Step 을 재처리 할 수 있..

Spring Batch 2022.04.02

JobParameterValidator

JobParameterValidator JobParameterValidator를 사용해서 Job 파라미터를 validation 처리할 수 있다. 만약 Job 파라미터로 날짜값이 전달 될때, 날짜 형식의 파라미터 맞는지 validation 처리해 보는 코드를 구현해 보자 먼저 아래와 같이 날짜 형식이 맞는지 검사하는 Validator를 구현한다. @AllArgsConstructor public class LocalDateParameterValidator implements JobParametersValidator { private String parameterName; @Override public void validate(JobParameters parameters) throws JobParameters..

Spring Batch 2022.04.02