모든 것은 어떠한 목적을 위해 발명된다.
스프링의 목적은 '객체지향설계' 이다.
스프링은 framework 형태로 개발자들의 객체지향설계를 인도한다.
실세계를 살때 우리는 대부분 어떤 개념을 객체로 인식한다.
우리가 인식하는 객체라는 단위를 프로그래밍에 적용시키자.
객체를 뜻함

넓은 의미로 실세계에 존재하거나 생각할 수 있는 것
우리가 개발을 하면서 접하게 될 프로그래밍에서의 객체는 속성과 기능을 가지는 프로그램 단위를 뜻합니다.
[Ex]
- Lotto, PurchaseAmount
- PurchaseController, RankController
- InputView, OutputView
자바 빈즈(Java Beans)
- JSP의 표준 액션 태그로 접근할 수 있는 자바 클래스. 즉 자바 객체이다.
- 값을 가지는 속성(멤버변수)과 값을 설정하는 메소드(setter) 값을 추출하는 메소드(getter)로 이루어져 있다.
- 자바빈즈는 하나의 JSP 페이지에 종속적으로 사용되는 것이 아니라, 여러 JSP 페이지에서 사용될 수 있다.
- 비즈니스 로직 부분을 담당하는 자바 프로그램 단위.
- 빌더 형식의 개발도구에서 가시적으로 조작이 가능하고 또한 재사용이 가능한 소프트웨어 컴포넌트.
- 쉽게 말 해 JSP 파일 내에서 사용이 가능한 자바 객체라고 생각해도 무방하다.
출처: https://ccomccomhan.tistory.com/37 [[꼼꼼한 개발자] 꼼코더:티스토리]
Separation of Concerns
소프트웨어 요소의 상관관계와 설계를 적용하는 것이다. 적절한 SoC를 통해 복잡성은 관리 가능해진다.
하나의 클래스는 하나의 관심사를 다루도록 분리한다
"가능한 모든 것들을 단순하게 만들어라. 더 단순하게가 아니라." _Albert Einstein
[Ex]
- Lotto : 1~45 사이의 중복되지 않은 숫자 6개
- PurchaseAmount : 구매 금액
- Result : 결과
- PurchaseController : 구매행위를 관리
- RankController : 등수 매기기를 관리
- InputView : 입력만
- OutputView : 출력만
[Ex2]
- 주방 알바1한테는 요리만 시키고
- 주방 알바2한테는 설거지만 시키고
- 홀 알바1한테는 서빙만 시키고
- 홀 알바2한테는 포장만 시키고
The Principle of Separation of Concerns
SoC 법칙이란 시스템 요소가 단일 목적이고 배타성을 가져야 한다는 것을 명시한다. 그 말은, 어떤 요소도 다른 요소와의 책임을 공유하면 안 되고, 그 요소와 관계가 없는 책임을 포함시킬 수 없다는 것이다.
SoC란 경계를 세우는 것으로서 달성된다. 경계란 주어진 책임 세트를 설명하는 논리적이거나 물리적인 제한이다. 경계란 애플리케이션 내에 핵심 행동을 정의하는 메소드, 객체, 컴포넌트, 서비스 등 의 사용을 의미한다. 혹은 소스 구성에 대한 프로젝트, 솔루션, 폴더 구조를 포함하기도 한다.
혹은 구조를 짜기 위한 애플리케이션 레이어와 티어들을 포함하기도 하고, 프로덕트 릴리즈 구성에 필요한 버전화 되어있는 라이브러리나 설치 파일을 포함하기도 한다.
그러나 Soc를 달성하는 프로세스는 종종 책임 세트의 분리를 내포하기도 한다. 목표는 시스템을 분리되지 않는 파트들로 조각 내는 것이 아니라, 시스템을 반복되지 않고 응집력이 있는 책임들의 세트를 가진 요소들로 구성하기 위함이다.
핵심은, SoC는 질서에 관한 것이다. SoC의 종합적인 목표는 각각의 파트가 의미있고 직관적인 롤을 수행하지만 변화에 적응하는 능력을 극대화시킨, 잘 조직된 시스템을 설립하는 것이다.
제어의 역전 : Inversion of Controller
프로그램의 제어 흐름 구조가 뒤바뀌는 것
[Ex]
만약 스프링 프레임워크를 활용해서 Lotto를 구현한다면?
[Ex2]
사장님이 직접 주방알바2한테 설거지 거리를 주면서 시키는게 아니라
설거지 거리가 생기면 주방알바2한테 설거지를 주면 된다는 매뉴얼을 만드는것
스프링이 제어권을 가지고 IoC 방식으로 직접 만들어 관계를 부여하는 객체
[Ex]
- 주방알바1,2
- 홀알바
빈 팩토리 : 스프링에서 빈의 생성과 관계설정과 같은 제어를 담당하는 IoC 객체
애플리케이션 컨텍스트 : IoC 방식에 따라 만들어진 빈 팩토리,
스프링 컨테이너 : 빈 팩토리이자 애플리케이션 컨텍스트 의존관계 주입을 이용하여 애플리케이션을 구성하는 여러 빈들의 생명주기와 서비스 실행 등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것을 부르는 말이다.
빈 팩토리라고 할 때는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것.
애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈의 생성, 관계 설정 등의 제어를 총괄하는 것 에 초점을 맞춘 것
[Ex]
이미 뒤지는 매뉴얼을 만들어놓은 매니저.
주방알바1(설거지 담당) 이라는 명찰
이 명찰을 받으면 설거지만 뒤지게 하면 되는거야~~

Spring framework는 매뉴얼 또는 매니저
여러분이 할일은?
- 무슨 가게를 할지, 어떤 메뉴를 할지 정하면됨
- 해당되는 알바생을 잘 뽑으면 됨.
막연하게 주방알바1이 아니라 일 잘하는 애로 뽑아야한다!!주방알바 1이 인터페이스라면?
- 일잘하는 일꾼 김수환은 구현체!!
물론 여러분이 김수환을 만들어야돼여ㅋㅋㅋ
객체의 인스턴스를 한개만 생성되게 하는 패턴
[Ex]
설거지가 생길때 마다 주방알바를 뽑기 vs 주방알바 하나를 잘 뽑아서 설거지 시키기
- 후자가 싱글톤
클라이언트의 요청이 들어올 때 마다 객체를 새로생성
-> 과부하, 서버가 감당할 수 없음
스프링은 싱글톤 패턴으로 객체를 생성하고 관리한다.
멀티 스레드 환경에서 여러 스레드가 동시에 접근 할 수 있다.
객체가 생성되고 존재하고 적용되는 범위
싱글톤 스코프
그 외의 스코프
의존성 주입 : Dependency Injection
의존성이란?
여배우 -> 남배우 그거
A ----> B : A가 B에 의존한다.
B의 변화가 A에 영향을 미친다.
IoC를 적용하여 객체지향적인 설계, 디자인 패턴, 컨테이너에서 동작하는 서버 기술을 사용한다.
[Ex]
음식점에 에어컨이 고장난 경우
- 알바생이 하는 역할 아니잖아여
- 에어컨 기사님 부르기
의존 관계의 객체를 가져올 때 메소드, 생성자를 통해 주입
빈 객체 사이에서만 가능
[Ex]
서빙담당 -> 요리담당
- 홀알바1(서빙담당)은 음식이 나와야 서빙을 할 수 있음.
- 서빙담당한테 어떤 요리담당한테 요리를 받으면 되는지 알려줘야함
[Ex2]
트리의 자식노드는 부모노드에 의존성이 있음
노드는 값에 의존성이 있음
자식노드에 부모노드를 넣어줘야함
생성자에 parameter를 활용하여 주입
[Ex]
Node(Node parNode,int val){ this.parNode = parNode; this.val = val; }
수정자(Setter) 메소드는 외부에서 객체 내부의 속성값을 변경하려는 용도로 사용
[Ex]
setParent(Node parNode){ this.parNode = parNode; }
수정자 메소드처럼 set으로 시작. 여러 개의 파라미터를 받을 수 있음
[Ex]
setParentAndVal(Node parNode,int val){ this.parNode = parNode; this.val = val; }
@Bean 어노테이션, XML(설정파일) 등을 통해 설정 정보에 직접 등록했음 @Component 어노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록@ComponentScan 어노테이션이 붙은 클래스가 구현된 인스턴스가 컴포넌트로 인식된 클래스들을 빈으로 등록한다.
- 스프링 프로젝트를 시작하면
@SpringBootApplication클래스가 프로젝트의 최상단에 위치하고 있다.@SpringBootApplication어노테이션을 뜯어보면@ComponentScan어노테이션이 붙었다.
컴포넌트 스캔에 의해 자동으로 빈 등록되는데, 이름이 같은 경우 스프링은 오류를 발생시킨다.
애플리케이션에서 제한된, 수 대개 한 개의 오브젝트만 만들어 사용하는 것이 싱글톤 패턴의 원리이다.
@Autowired 라는 어노테이션을 붙여 의존성을 주입한다.
@Autowired 어노테이션을 붙이기@Autowired 어노테이션 붙이기@Autowired 어노테이션 붙이기@Autowired 어노테이션 붙이기스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다.
Why? 공부해보기.
넓은 의미로 실세계에 존재하거나 생각할 수 있는 것
알바 뿐 아니라 나오는 음식, 접시, 포크, 식탁, 의자 다 오브젝트!!
domain :
지방 정부의 관할, 학문 영역, 활동 영역, 인터넷 주소 하위 구분 등의 의미로 사용
해결하고자 하는 문제 영역, 핵심 비즈니스 요구사항
문맥에 따른 도메인의 다양한 해석
생각해보기
로또 과제에서 도메인은 뭐가 있을까?
실제, 독립체
- 데이터 모델링에서 사용되는 객체
도메인에 필요한 정보를 저장하고 관리하기 위한 "thing".
"thing" : 추상적인 의미를 가짐. 학교, 학생처럼 현실에 보이는 개념일 수도, 주문이나 결제처럼 눈에 보이지 않는 개념일 수도 있음.
| 학번 | 이름 | 전공 | 평점 | ... |
|---|---|---|---|---|
| 1221.... | 김수환 | 컴퓨터공학과 | 4.45 | ... |
| 1219.... | 이승철 | 컴퓨터공학과 | 1.66 | ... |
| ... | ... | ... | ... | ... |
| 1224.... | 홍명보 | 체육교육과 | 3.33 | ... |
| 1223.... | 박주호 | 사회복지과 | 4.45 | ... |
엔터티 특징
도메인에 필요한 엔티티가 뭐고 해당 엔티티에 어떤 속성들이 필요한지 생각해야 함.
[EX]식당 예시
제육볶음은 엔티티일까 인스턴스 일까?
제육볶음 이라는 메뉴 : 엔티티
주방 요리로봇이 만든 제육볶음 : 인스턴스
Data Transfer Object : 데이터 전송 객체
프론트엔드에서 데이터를 요청 -> 백엔드가 데이터를 응답
[Ex] 식당예시
손님이 제육볶음을 요청(안맵게, 파 많이)
- 서빙 알바가 요청을 받음
- 요청을 요리알바에게 전달
- 요리알바가 요리 후 서빙알바에게 전달
- 서빙알바는 손님에게 요리를 전달
손님 : 프론트엔드
서빙알바와 요리알바 : 백엔드
[Ex2] 친구 게시글에 댓글을 달기 위해 게시물을 들어가 댓글달기
- 프론트엔드는 우선 그동안의 댓글 내역을 요청
- 백엔드는 저장해둔 댓글 내역을 응답
- 프론트엔드는 응답받은 걸 사용자에게 보여줌
- 사용자는 댓글을 치고 확인버튼을 누름
- 프론트엔드는 댓글을 저장해달라고 요청
- 백엔드는 저장을 하고 저장성공했다고 응답
[Ex] 식당예시
손님이 제육볶음을 요청(안맵게, 파 많이)
- 서빙 알바가 요청을 받음
..- 서빙알바는 손님에게 요리를 전달
여기서 DTO는?
손님의 요청에 맞게 접시에 잘 플레이팅된 제육볶음손님입장에서는 누가 요리했고 자시고 잘 플레이팅된 제육볶음을 받는게 중요함
댓글이라는 데이터에는 뭐가 필요한가?
댓글 조회 요청 :
(백 -> 프론트)
- 댓글내용
- 작성자
- 좋아요 수
- 작성시간 등
댓글 저장 요청
(프론트 -> 백)- 댓글내용
- 작성자
- 작성시간 등
실제로 DB에 접근하여 data를 삽입, 삭제, 조회, 수정 등 CRUD 기능을 수행
DAO는 데이터베이스에 접근하기 위한 로직과 목표하는 비즈니스를 처리하기 위한 로직을 분리시키기 위해 사용한다.
[Ex] 식당예시
목표 : 제육볶음
식당내에 식료품 저장창고를 두면 월세 50억이 필요하다고 가정합시다.
50m거리에 창고를 사용하면 월세 500만원이라고 가정합시다.
창고에 왔다 갔다 하는 알바를 하나 더 뽑자 : 창고 알바
-> DAO
자체적으로 서비스의 필요한 데이터를 메모리에 저장한다고 해보자
데이터베이스를 활용 -> 데이터베이스에 접근하려면 창고 알바가 필요하다.
요리알바가 직접 왔다갔다하는건 너무 비효율적.
: 서빙 알바
요청을 받아서 DTO에 담아 반환
: 요리알바
Controller가 요청을 받아 Service에 전달
aka DAO : 창고알바
Service가 비즈니스 로직 수행하여 엔티티 상태를 변화 후 저장
Repository가 상태 변화를 반영하여 데이터베이스에 접근