SRP 단일 책임 원칙한 클래스는 하나의 책임만 가져야 한다.클라이언트 객체는 직접 구현 객체를 생성하고, 연결하고, 실행하는 다양한 책임을 가지고 있음SRP 단일 책임 원칙을 따르면서 관심사를 분리함구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당클라이언트 객체는 실행하는 책임만 담당 DIP 의존관계 역전 원칙프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.”의존성 주입은 이 원칙을 따르는 방법 중 하나다.AppConfig가 FixDiscountPolicy 객체 인스턴스를 클라이언트 코드 대신 생성해서 클라이언트 코드에 의존관계를 주입 OCP소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다다형성 사용하고 클라이언트가 DIP를 지킴애플리케이션을 사용 영역과 구성 ..
전체 글
AppConfig를 통해 OrderServiceImpl에 있는 DiscountPolicy에 주입해준다.public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy()); }}//중복 고려한 리팩터링public class AppConfig { public MemberService member..
비즈니스 요구사항 설계회원 회원 회원을 가입하고 조회할 수 있다.회원은 일반과 VIP 두 가지 등급이 있다.회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정) 주문과 할인 정책회원은 상품을 주문할 수 있다.회원 등급에 따라 할인 정책을 적용할 수 있다.할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경 될 수 있다.)할인 정책은 변경 가능성이 높다.회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루 고 싶다. 최악의 경우 할인을 적용하지 않을 수 도 있다. (미확정)회원 도메인 설계회원 도메인 요구사항회원을 가입하고 조회할 수 있다.회원은 일반과 VIP 두 가지 등급이 있다.회원 데이터는 자체 DB를 구축..
시간측정@Aspect@Componentpublic class TimeTraceAop { @Around("execution(* hello.hellospring..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); System.out.println("START: " + joinPoint.toString()); try { return joinPoint.proceed(); } finally { long finish = System.currentTim..
데이터베이스 결정domain 생성Repository 작성RespositoryTest에서 Repository를 받아와 테스트 진행Service 생성Service 테스트Controller 작성@ResponseBody 를 사용.HTTP의 BODY에 문자 내용을 직접 반환 viewResolver 대신에 HttpMessageConverter 가 동작기본 문자처리: StringHttpMessageConverter기본 객체처리: MappingJackson2HttpMessageConverterbyte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음GetMapping으로 어떤 서비스를 처리한 후 어떤 화면을 뿌려줄건지 작성PostMapping으로 어떤 데이터를 어느 화면에 보낼건지 작성
@EntityManagerJPA를 사용하기 위해서는 Database 구조와 맵핑된 JPA Entity 들을 먼저 생성하게 된다.모든 JPA의 동작은 이 Entity들을 기준으로 돌아는데, 이를 관리하는 역할Thymeleaf '템플릿 엔진'의 일종. html 태그에 속성을 추가해 페이지에 동적으로 값을 추가하거나 처리할 수 있다. https://www.thymeleaf.org/TomcatWAS(Web Application Server)’의 대표적인 미들웨어 서비스 https://taes-k.github.io/2020/02/16/servlet-container-spring-container/스프링 컨테이너(helloController -> viewResolver) https://ittrue.tistor..
h2base 설정implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'com.h2database:h2' Datasource데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다. application.properties spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.usernam..
OptionalNPE (NullPointerException) : 개발을 할 때 가장 많이 발생하는 예외Optional는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE가 발생하지 않도록 도와준다.Optional.of() - 값이 Null이 아닌 경우Optional.ofNullbale() - 값이 Null일수도, 아닐수도 있는 경우Optional은 값을 Wrapping하고 다시 풀고, null 일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로잘못 사용하면 시스템 성능이 저하된다.자바에서는 거의 모든것이 래퍼런스 -> 거의 모든것이 null이 될 수 있다.메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다.출처: https:..
@GetMappingHTTP Get Method에 해당하는 단축 표현으로 서버의 리소스를 조회할 때 사용합니다. /GetMapping?name=입력값 Model -> viewResolver로 값 넘기는 방법인듯? => 데이터를 Model에 담아 보냄 @RequestParam @RequestParam("가져올 데이터의 이름") [데이터타입] [가져온데이터를 담을 변수]return "hello-template"; //뷰로 값을 넘겨줌 @ResponseBody @ResponseBody를 사용하면 viewResolver를 사용하지 않고 대신에 HTTP의 BODY에 문자 내용을 직접 반환HTTP의 BODY에 문자 내용을 직접 반환 viewResolver 대신에 HttpMessageConverter 가 동작 기본..
Lombok 장점어노테이션 기반의 코드 자동 생성을 통한 생산성 향상 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상 Getter, Setter 이외에 Builder(빌더) 패턴이나 로그 생성 등 다양하게 활용 가능 단점 만약 Intelli J에서 개발 시에는 모든 팀원이 Lombok 플러그인을 설치하여야만 한다. 무분별한 어노테이션을 사용하면, 순환 참조 또는 무한 재귀 호출로 인해 StackOverFlow 가 발생할 수 있다. @Data @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 를 자동 완성시켜준다. 무분별하게 사용하다 보면 프로그램이 무거워지고 객체의 안정성을 해치기 때문에 사용을 지양 @AllAr..
https://github.com/okskna/ComputerArchitecture_Summary
스트림데이터 소스를 변경하지 않는다.일회용이다작업을 내부 반복으로 처리한다.데이터의 연속이다Collections.stream() 을 제공 (Java8) 스트림 연산 중간연산 : 연산 결과가 스트림인 연산. 스트림에 연속해서 중간 연산할 수 있음최종 연산 : 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 단 한번만 가능 stream.distinct().limit(5).sorted().forEach(System.out::println) 중간 연산 중간 연산 중간 연산 최종 연산스트림의 최종 연산forEach() : 스트림의 요소를 출력하는 용도findFirst() : 스트림의 요소 중에서 조건에 일치하는 첫 번째 것을 반환, 주로 f..