스프링(Spring)이란?
- JAVA의 웹 프레임워크로 JAVA 언어를 기반으로 사용한다.
- JAVA로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀이라 할 수 있다.
- JAVA의 활용도가 높아지면서, JAVA를 이용한 기술이 JSP, Mybatis, JPA 등의 기술이 생겨났다.
- Spring은 다른 사람의 코드를 참조하기 쉽고 편리한 구조로
앞서 말한 기술들을 더 쉽게 사용해주는 오픈소스 프레임워크 이다.

웹 서버(Web Sever)
- HTTP 기반으로 동작
- 정적 리소스 제공,기타 부가기능
- 정적(파일) HTML,CSS,JS,이미지,영상
- 예) NGINX,APACHE
웹 애플리케이션 서버(WAS)
- HTTP 기반으로 동작
- 웹 서버 기능 포함 + (정적 리소스 제공 가능)
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML,HTTP API(JSON)
- 서블릿,JSP,스프링 MVC
- 예)톰캣(Tomcat) Jetty,Undertow
톰캣(tomcat)은 흔히 WAS(Web Application Server)
- dynamic(동적)인 웹을 만들기 위한 웹 컨테이너, 서블릿 컨테이너라고 불리며, 웹서버에서 정적으로 처리해야할 데이터를 제외한 JSP, ASP, PHP 등은 웹 컨테이너(톰캣)에게 전달한다.
- 동적인 데이터 처리가 가능하고, DB연결, 데이터 조작, 다른 응용프로그램과 상호 작용이 가능하다.
- 톰캣은 8080포트로 처리한다.
객체 지향 특징
- 추상화
- 캡슐화
- 상속
- 다형성
객체 지향 프로그래밍
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다
- 객체 지향 프로그래밍은 프로그램을 유연 하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
다형성(多形性)이란?
- 한자 이름 그대로 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미
- 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성
- 역할과 구현으로 세상을 구분
- 메서드 오버라이딩과 메서드 오버로딩(method overloading)


장점
- 클라이언트는 대상의 역할(인터페이스)만 알면된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.

public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
역할과 구현을 분리(정리)
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
- 유연하고,변경이 용이
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않는 변경 가능
- 인터페이스를 안정적으로 잘 설계하는 것이 중요
SRP - 단일 책임 원칙(single responsibility principle)
OCP - 개방-폐쇄 원칙 (Open/closed principle)
LSP - 리스코프 치환 원칙(Liskov substitution principle)
ISP - 인터페이스 분리 원칙(Interface segregation principle)
DIP - 의존관계 역전 원칙(Dependency inversion principle)
구현 클래스에 의존하지 말고,인터페이스에 의존해라
역할(ROLE)에 의존해야한다는 것
객체 세상도 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경 가능하다!구현체에 의존하게 되면 변경이 매우 힘들어진다...
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
김영한 - 스프링 핵심 원리 기본편 강의를 참고해서 정리했습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?gad_source=1&gclid=CjwKCAjw6JS3BhBAEiwAO9waF-U94I5Q7HOBbL2-GdSWah8TZfAF48E3wQIKeOHwAc6cDY6Xkeu25BoC7BMQAvD_BwE