[TIL #23] 싱글톤 패턴에 대하여
·
개발/내일배움캠프 TIL
저번시간에 AppConfig로 다른 클래스에 객체를 주입하는 방식으로 리팩토링하면서 클래스들이 구현 객체에 의존하는 게 아니라 추상 객체인 인터페이스에 의존하게 변경하여 DIP와 OCP 원칙을 지켜봤다. 이러면 이제 모든 클래스에서 AppConfig 객체를 생성하고 클래스 생성자를 만들어주면 생성자를 통해 객체를 주입받아 사용할 수 있게 되었을 것이다. 그런데 이렇게 될 경우 사용자가 요청을 할때마다 객체가 AppConig 객체가 생성되고 그 안에 있는 객체 또한 전부 생성되어 메모리 낭비가 과해진다. 사용자가 적다면 문제 없겠지만 1000명, 10000명이 넘어가는 순간 서버가 다운되고 말것이다.  @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureCo..
[TIL #22] 키오스크 DIP, OCP 원칙 지키기
·
개발/내일배움캠프 TIL
각 클래스에서 직접 생성된 객체 분리하기private final MenuItemRepository menuItemRepository = new LocalMenuItemRepository(); 메뉴를 찾아서 출력 클래스로 전달할 Service 클래스에서 Repository에 저장된 데이터와 메서드를 사용하기 위해 Service 클래스에서 객체를 생성해서 직접적으로 구현 객체를 주입하고 있다. DIP(의존관계 역전 원칙)를 지키기 위해 외부에서 주입하도록 변경하였다. package Kiosk;import Kiosk.menu.LocalMenuItemRepository;import Kiosk.menu.MenuService;import Kiosk.menu.MenuServiceImpl;public class Kio..
[TIL #21] 키오스크 과제 설계 및 중간 리팩토링
·
개발/내일배움캠프 TIL
새로운 키오스크 과제가 주어져 바로 설계에 들어갔다.확실히 스프링을 공부하면 지속적으로 회원관리나 상품 리스트를 보여주는 것과 같은 걸 Controller, Service, Repository 개념으로 나누어 몇번씩이나 설계하고 다이어그램을 아침부터 저녁까지 질리도록 봐서 그런지 처음에는 조금 고민했지만 막상 시작하니 생각보다 쉽게 느껴졌다. 무엇보다 스프링 강의중에 스프링을 왜 써야하는 지 몸소 느끼기 위해 순수 자바로만 회원/주문 관리 시스템을 구현해보고 그걸 스프링으로 리펙토링 해보는 경험해봤는데 이게 이번 과제에서 아주 크게 도움이 됐다. 먼저 시스템 설계를 위해 다이어그램을 피그마로 그려보았다. 초기 설계는 이렇게 했는데 개발하다보니 몇몇 부분 수정이 되긴 했지만 90%는 설계대로 구현을 완료하..
[TIL #20] 의존관계 주입 DI 와 제어의 역전 IoC
·
개발/내일배움캠프 TIL
// 주문 비즈니스 로직public class OrderServiceImpl implements OrderService {// 할인 정책 객체 생성private final DiscountPolicy discountPolicy = new RateDiscountPolicy();}기존 코드는 다음과 같이 서비스 클래스에서 직접적으로 할인 정책에 대한 구현 클래스는 직접적으로 객체를 생성해서 넣어주고 있다.이것은 직전에 공부했던 `DIP`(추상화에 의존하며 구체화에 의존하면 안된다)와 만약 할인 정책이 변경된다고 하면 새로운 구현 클래스를 만들어 해당 코드를 변경해야 하는데 이것은 `OCP`(확장에는 열려있지만 변경에는 닫혀있어야한다)를 위반하는 것이다. 그렇다면 `DIP`와 `OCP`를 모두 만족시키려면 어떻..
[TIL #19] 좋은 객체 지향 설계의 5가지 원칙 (SOLID)
·
개발/내일배움캠프 TIL
좋은 객체 지향 설계의 5가지 원칙에 대해SRP(Single responsibility principle) 단일 책임 원칙OCP(Open/closed principle) 개방-폐쇄 원칙LSP(Liskov substitution principle) 리스코프 치환 원칙ISP(Interface segregation principle) 인터페이스 분리 원칙DIP(Dependency inversion principle) 의존관계 역전 원칙 1. SRP(Single responsibility principle) 단일 책임 원칙한 클래스는 하나의 책임만 가져야 한다.(하나의 책임이라는 것은 모호해서 문맥과 상황에 따라 다름)중요한 기준은 변경이다. 변경이 필요할 때 파급 효과가 적으면 해당 원칙을 잘 지킨 것2. O..
[TIL #18] Spring Boot 어노테이션 정리, Lombok 사용법
·
개발/내일배움캠프 TIL
Spring ContainerController, Repository, Service 등의 어노테이션이 지정된 클래스를 Bea으로 등록하여 관리한다. Controller보통 HTTP 요청을 처리하며 사용자의 요청(Request)을 받아 처리하고, 적절한 응답(Response)을 반환하는 역할을 한다.`@GetMapping` : URL로 HTTP get 요청을 받아, 필요한 로직을 수행하고 반환.`@PostMapping` : URL로 HTTP post 요청을 받아, 필요한 로직을 수행하고 반환.`@PathVariable` : 사용자가 입력한 경로 변수를 추출  Repository데이터베이스와 상호작용하여 CRUD를 수행.public interface ItemRepository extends JpaRepo..
[TIL #17] JPA로 데이터베이스 연결 맛보기
·
개발/내일배움캠프 TIL
@EntityJPA에서 엔티티 클래스임을 나타내는 에노테이션. 엔티티 클래스는 데이터베이스의 테이블과 매핑되며, 테이블의 각 행을 나타내는 객체를 생성하는 데 사용. 특징 및 사용법@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 Id 값 자동 생성 private Long id; @Column(name = "username", nullable = false, unique = true) // 테이블의 컬럼 매핑 private String username; @Column(name = "email") private String email; public Long..
[TIL #16] spring DB 접근 기술에 대해
·
개발/내일배움캠프 TIL
Spring에서 데이터베이스에 접근하기 위한 방법이 세가지가 있는데 JDBC, JDBC template, JPA 가 있다.JDBC(Java Database Connectivity)는 데이터베이스 접근하기 위한 API로 SQL을 실행 및 연결 관리를 위해 sql도 직접 다 짜야하고 코드가 무지막지하게 길어 순수 JDBC는 지금은 잘 쓰지 않는다고 한다.JDBC Template 는 JDBC에서 중복코드를 줄여주는 라이브러리이고 실무에서 꽤 쓴다고 함.JPA 는 기존의 반복 코드는 물론이고, 기본적인 SQL도 직접 만들어서 실행해줘서 개발 생산성을 크게 높일 수 있다. 사실상 지금와서 중요한건 JPA이고 스프링만큼 학습해야할 분량도 방대하다고 하다.(순수 JDBC로 데이터베이스에 접근하고 조회하는 코드 짜는 ..
[TIL #15] Spring 코드 테스트 하기
·
개발/내일배움캠프 TIL
테스트를 만들 클래스에서 `cmd` `shift` `t` 를 누르면 알아서 테스트 파일을 생성해준다.테스트 생성창에서 클래스이름도 자동으로 입력되며 테스트하고 싶은 메서드도 선택할 수 있다. 테스트를 할 땐 메서드 앞에 `@Test` 어노테이션을 붙여 단위 테스트임을 명시해준다. @Test void 테스트메서드() { //given // 뭔가 주어졌고 //when // 이걸 실행했을때 //then // 이런 결과가 나와야한다 } 테스트를 할땐 다음과 같이 주석으로 단계를 명시해주면 코드 작성을 좀 더 원활하게 할 수 있으니 항상 명시하고 연습하자.`given` : 어떤 데이터가 주어졌을 때`when` : 어떤 함수를 실행하면`then` : 어떤 결과가 나와야 한다.Assertion..
인텔리제이 자바 유용한 단축키들
·
개발
맥북 기준`cmd` + `shift` + `t` : 테스트파일 만들기`cmd` + `n` : 생성자, 메서드 생성 (getter, setter)`cmd` + `d` : 라인 복사 붙여넣기`cmd` + `backspace` : 라인 삭제`shift` + `option` + `↑↓` : 라인 옮기기`shift` + `cmd` + `↑↓` : 구문 옮기기`option` + `cmd` + `m` : 메소드 추출하기`option` + `cmd` + `v` : 변수 추출하기`option` + `enter` = 빠른 픽스`shift` + `f6` = 변수 이름 전체 수정`opt` + `cmd` + `t` = 감싸기 (반복문, 조건문, try catch 등등)`ctrl` + `r` = 이전에 실행했던 것을 다시 실행폴..