Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions week1/[1주차] {정윤주}.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# 1주차 학습 내용
객체지향적으로 코드를 작성해보는게 처음이라 역할을 어떻게 분리해야 할 지 고민하는데
많은 시간을 쓰다보니 아직 코드 구현을 다 하지 못했습니다.
객체지향적으로 구현하려고 노력했지만, 잘 지키지 못한 것 같습니다. 다음 과제에서는
더 나은 코드를 작성할 수 있도록 노력하겠습니다.

또한, MVC패턴에 대해서 정확히 이해하지 못했었는데, 이번 과제를 통해
각 구성 요소가 어떤 역할을 하는지 조금은 더 이해할 수 있게 된 것 같습니다.
---
### Stream
- 데이터 흐룸 속에서 각각의 원하는 값을 가공하여 최종 소비자에게 제공하는 역할
- 불필요한 코딩(for, if) 없이 구현 가능
- 주로 Collection, Arrays에 사용됨
- 구조
- Stream 생성
- 중간 연산
- 최종 연산
- Collections객체 집합.스트립 생성().중간연산().최종연산()
- 파이프라인: .으로 연계할 수 있게 하는 방법
- 스트림 생성
- 배열을 stream 형식으로 입력 받았을 때: Arrays.stream(배열)
- 객체를 stream 형식으로 입력 받았을 때: 객체.stream()
```Java
winningNumbers = Arrays.stream(inputWinningNumbers.split(","))
.map(String::trim)
.mapToInt(Integer::parseInt)
.boxed()
.collect(Collectors.toList());
```
- inputWinningNumbers 문자열을 쉼표로 분리하여 스트림 생성(데이터 소스)
- .map(String::map): 스트림의 각 문자열 요소의 공백 제거(중간 연산)
- .mapToInt(Integer::parseInt): 스트림의 각 문자열 요소를 정수로 변환(중간 연산)
- .boxed(): IntStream을 Stream<Integer>로 변환(중간 연산)
- .collect(Collectors.toList()): 스트림의 정수들을 리스트로 모음(최종 연산)
---
### static
멤버 변수 혹은 메서드를 static으로 선언 -> 객체 생성하지 않고 사용 가능
- static 키워드는 final 키어드와 함께 상수 정의함
- 일반적으로 생성자에는 사용X
- 특정 객체의 상태를 초기화하는 생성자와는 역할 맞지 않음
- 새로 추가된 멤버 변수를 반환하는 메서드 -> static 메서드 되면 안됨
- static 메소드는 특정 객체의 상태에 접근할 수 없음
- 객체마다 다른 값을 가질 수 있는 멤버 변수 반환하는 getter메소드는 static으로 만들면 안됨
- 입력 값에 의존하여 항상 같은 결과를 반환하는 유틸리티 메소드 등에 적합
### final
- 한 번 값을 정의하면 더 이상 다른 값 넣을 수 없음
- 보통 상수는 객체의 생성과 무관 -> static final
27 changes: 27 additions & 0 deletions week2/[2주차] {정윤주}.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 2주차 학습 내용

### 코드 변경점
- 중복되는 입력값 검증은 InputValidator 에서 처리
- 특정 객체 상태와 무관하게 공통적으로 사용하는 검증 로직이라고 생각해서 static 메서드로 선언했습니다
- 에러 메시지 enum 으로 관리
- LottoConstants 에서 상수 관리
- BonusNumber, PurchaseAmount 생성자에서 바로 유효성 검사 및 파싱
- BonusNumber 에서 WinningNumbers 객체 받아 보너스 번호 받아 중복 여부 검증
- Manager 이름 수정
- 통제할 수 없는 랜덤 번호 생성 인터페이스로 분리
- 랜덤 번호 생성일 경우 우리가 통제할 수 없어 테스트하기 어려움
- 따라서 통제할 수 없는 구조를 통제 가능한 구조로 만들기 위함(?)
- static 메서드로 선언할 경우 프로그램의 시작과 동시에 static 영역에 할당되어
프로그램 끝날때 까지 유지되기 때문에 테스트 결과를 고정시킬 수 없음(?)

### 고민했던 점

책임을 분리하려고 고민을 많이 했는데 어디부터 어디까지의 책임을 하나의 객체의 책임이라고 하는지의 기준을
아직은 잘 모르겠습니다. (예를들면 보너스 번호를 파싱하고 검증하는 책임을 생성자가 다 해야하는지
아니면 검증은 검증하는 객체에서 따로 해야하는지)



의존성과 관련된 부분은 아직 잘 모르겠습니다. 의존성 주입에 대해서 알아보긴 했지만, 아직 어떻게 사용해야하는지
왜 그렇게 해야하는지에 대해서는 이해를 못한 상태에서 코드에 적용하다 보니 사실 어떤 방식으로 의존성이 낮아지는지는
잘 모르겠습니다..
95 changes: 95 additions & 0 deletions week3/[3주차] {정윤주}.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# 3주차 학습 내용


## **1. 의존성 주입 종류 알아오기**
> ### 의존성 주입
> - 클래스 간 강한 결합을 풀어주어 조금 더 OOP 스러운 개발을 할 수 있도록 만들어 줌.
> - 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것이다.
> - 의존성 주입을 해야하는 이유
> - test가 용이해진다
> - 코드의 재사용성을 높여준다
> - 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다
> - 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다
### 1. 필드 주입
- Service를 사용하려는 Controller의 필드에 직접 @Autowired를 부여하는 방식
- 특징
- 코드가 간결해진다
- 단, 외부에서 변경이 불가능하여 테스트하기 어려운 단점이 있다
- DI 프레임워크가 없으면 아무것도 할 수 없다
- 애플리케이션의 실제 코드와 상관없는 특정 테스트를 하고 싶을 때 사용한다
- 만약, 의존관계를 필수적으로 넣지 않으려면 @Autowired(required=false) 옵션 처리를 통해 필수가 아님을 명시할 수 있다.
### 2. 수정자 주입
- Setter 메서드를 통해 주입하는 방식
- @Component를 통해 실행하는 클래스를 스프링 빈으로 등록하고 의존관계를 주입하게 된다.
- @Autowired가 있는 수정자들을 자동으로 의존관계를 주입한다.
- 특징
- 선택과 변경 가능성이 있는 의존 관계에 사용
- 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다
- set필드명 메서드를 생성하여 의존 관계를 주입한다
- @Autowired를 입력하지 않으면 실행이 되지 않는다
### 3. 생성자 주입
- 생성자를 통해서 의존 관계를 주입하는 방법
- 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에게 필요한 빈들을 주입한다.
- 특징
- 생성자 호출 시점에 1번만 호출되는 것을 보장한다
- 불변과 필수 의존 관계에 사용한다
- 생성자가 1개만 존재하는 경우 @Autowired를 생략해도 자동 주입된다.
- NPE(NullPointerException)를 방지할 수 있다.
- 주입받을 필드를 final로 선언 가능하다

## **2. 스프링 사용 이유 공부**
### 1. 모듈성과 유연성
Spring은 다양한 모듈로 구성되어 있어 필요한 기능만 선택적으로 사용할 수 있다. 이는 개발자에게
모듈성과 유연성을 제공하며, 필요한 부분만 사용하여 불필요한 복잡성을 피할 수 있다.

### 2. IoC(Inversion of Control) 컨테이너
Spring의 IoC 컨테이너는 객체의 생성, 관리, 의존성 주입을 처리하여 코드의 유지보수성과 테스트 용이성
을 향상시킨다. 개발자는 객체의 라이프사이클을 직접 관리하지 않아도 되므로 개발 생산성이 향상된다.

### 3. AOP(Aspect-Oriented Programming)
Spring은 AOP를 지원하여 핵심 비즈니스 로직과는 별도로 관심사를 모듈화 할 수 있다. 예를 들어,
로깅, 트랜잭션 관리, 보안 등과 같은 공통된 관심사를 별도의 모듈로 분리하여 코드의 중복을 방지하고
유지 보수성을 향상시킨다.

### 4. 데이터 액세스 및 트랜잭션 관리
Spring은 데이터베이스 액세스를 위한 강력한 기능을 제공한다. JDBC와 ORM 프레임워크를 통한 데이터 액세스,
트랙잭션 관리를 간편하게 구현할 수 있다.

### 5. MVC 웹 프레임워크
Spring MVC는 모델-뷰-컨트롤러 아키텍처를 제공하여 웹 애플리케이션을 구조화하고 유지보수하기 쉽게
한다. 또한, 다양한 확장 가능한 기능과 통합이 가능한 구조를 제공한다.

### 6. 보안
Spring Security는 보안 관련 기능을 제공하여 사용자 인증, 권한 부여, 보안 설정을 쉽게 처리할 수 있다.

### 7. 테스트 용이성
Spring은 의존성 주입과 컨텍스트 분리로 테스트하기 쉬운 코드를 작성할 수 있도록 지원하여, 테스트
주도 개발(TDD)에 유리한 환경을 제공한다.

### 8. 커뮤니티와 생태계
Spring은 큰 커뮤니티와 다양한 생태계를 가지고 있어서 문제 해결, 정보 공유, 다양한 라이브러리 및 플러그인을
활용할 수 있다.

## **3. 스프링 컨테이너 알아오기**
### 스프링 컨테이너
- 스프링에서는 자바 객체를 빈(Bean)이라 한다
- 스프링 컨테이너는 내부에 존재하는 빈의 생명 주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된
빈에게 추가적인 기능을 제공하는 것이다.

### 스프링 컨테이너 종류
스프링 컨테이너는 Beanfactory와 ApplicationContext 두 종류의 인터페이스로 구현되어 있다. 빈 팩토리는 빈의 생성과
관계설정 같은 제어를 담당하는 IoC 오브젝트이고, 빈 팩토리를 좀 더 확장한 것이 애플리케이션 컨텍스트이다.

**1.BeanFactory**
- 스프링 컨테이너의 최상위 인터페이스
- BeanFactory는 빈을 등록, 생성, 조회 등의 빈을 관리하는 역할을 하며, getBean() 메서드를 통해 빈을 인스턴스화 할 수 있다.

**2.ApplicationContext**
- 애플리케이션 컨텍스트는 BeanFactory의 기능을 상속받아 제공한다.
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공한다.
- 부가 기능
- MessageSource: 메시지 다국화를 위한 인터페이스
- EnvironmentCapable: 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
- ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
- ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
Loading