객체 지향이란?
객체들이 공동 목표를 통해 각각의 객체가 메시지를 주고받으면서 협력하며 주어진 역할과 책임을 다하는 과정이라고 생각합니다.
1. 추상화
공통점을 취하고 차이점을 버리는 일반화를 통해 단순화하는것입니다.
2. 캡슐화
(송신자가 수신자를 몰라도 요청이 가능하게 되면서 수신자의 외부처리와 내부처리를 분리하는것입니다.)객체들의 공통적인 특징들을 뽑아내는 것입니다. 구현내용을 캡슐처럼 안해 감추어 은닉하는것.
3. 상속
부모 객체의 기능을 그대로 물려받는것을 상속이라고 합니다.
4. 다형성
객체가 동일한 메세지에 대해 서로 다른 메서드를 이용해 메세지를 처리한다는 것을 다형성이라고 하는것같습니다. 서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는것을 말합니다.
SRP(Single Responsibility) - 단일 책임 원칙
클래스는 단 한 개의 책임을 가져야 한다.
클래스를 변경하는 이유는 단 한개여야 한다.
변경이 있을때, 파급 효과가 적게 만들어야된다
OCP(Open-Closed) - 개방-폐쇄 원칙
확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
ISP(Interface Segregation) - 인터페이스 분리 원칙
큰 덩어리의 인터페이스를 구체적이고 작은 단위로 분리시키라는 원칙을 말합니다.
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 각 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다.
DIP(Dependency Inversion) - 의존 역전 원칙
구현클래스에 의존하지 말고, 인터페이스에 의존해야 한다는 그래야 유연하게 구현체를 변경할수가 있습니다. 역할에 의존하게 해야 한다.
프레임워크랑 라이브러리의 차이점은?
프레임워크는 특정한 문제 해결을 위해 어느 정도의 뼈대 즉, 구조를 제공해주는 것을 의미하구요, 라이브러리는 특정 기능 사용을 위한 도구나 함수들의 모음을 의미합니다.
라이브러리와 프레임워크의 차이는 프로그램의 전체 흐름에 대한 제어권에서 차이가 발생합니다. 프레임워크는 프로그램의 전체적인 흐름을 자체적으로 가지고 있으며 프레임워크가 사용자가 작성한 코드를 호출해서 사용합니다. 하지만 라이브러리는 사용자가 프로그램의 전체적인 흐름을 제어하며 사용자가 코드로써 라이브러리의 특정 기능을 직접 가져다 쓰는것을 의미합니다.
스프링이란?
스프링란 자바이란 위한 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크입니다. 객체를 관리할수 있는 컨테이너를 제공 해주고 의존성 주입과 제어의 역전을 통해 결합도를 낮춰준다는 특징이 있습니다.
스프링과 스프링부트의 차이
스프링부트는 스프링을 더욱 편리하게 사용할수 있도록 도와주고, 톰캣같은 웹 서버를 내장하고 있고 jar 파일을 통해 손쉽게 배포가 가능합니다. 그리고 starter를 통해서 의존성과 설정을 자동으로 해줍니다.
DI란?
클래스 사이의 의존 관계를 빈(Bean)설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다. 어플리케이션 실행 시점에 객체를 생성하고 관계를 결정함으로써 다른 객체에 의존하는 코드를 제거하여 두 객체의 결합을 약하게 해줍니다.
사용하는 이유 : 결합도가 낮아지고, 코드 수정이 쉬워지며, 테스트 작성을 용이하게 해줍니다.
di 방식 세가지 생성자 주입 autowired setter주입
-생성자 주입을 쓰는이유?
생성자 호출 시점에 1회를 생성하는 것이 보장되고, 컴파일 시점에 객체를 주입받아 테스트 코드를 작성 할수 있습니다. 그리고 순환참조를 방지 할 수 있습니다.
IOC란?
개발자가 작성한 코드의 제어권이 프레임워크에 넘어가서. 인스턴스의 생명주기 전체에대한 권한과 관리를 을 개발자 대신 스프링 컨테이너에게 맡겨 비즈니스 로직에만 신경쓰면 된다. 따라서 낮은 결합도를 유지한다
IOC컨테이너란?
IoC Container에서 관리하는 객체의 생성과 관계설정, 사용, 제거 등의 전체 Lifecycle을 관리해주는 작업을 하는 컨테이너를 IoC 컨테이너라고 부릅니다.
AOP란?
핵심 비즈니스 로직과 (비즈니스 메소드마다 반복해서 등장하는) 공통 로직을 떼어내서 분리하고, 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 모듈화 재사용하는 기술을 AOP라고한다 사용 예로는 로깅, 트랜잭션, 인증 등이 존재합니다
객체를 잘 활용하기 위해서 관심사의 분리를 잘 이용해야 하는데 oop로는 한계가 있다. 그래서 aop가 나왔고 aop는 이 공통 관심사 코드를 모듈화해서 관리한다
웹흐름
1.요청된 URL을 dispatcher-servlet에 전달하고
2.핸들러 매핑은 해당 URL에 매핑된 컨트롤러가 있는지 검사 후 컨트롤러에 전달합니다.
3.그리고 해당 컨트롤러가 로직을 처리하고 결과를 ModelAndView 객체에 담고 반환할 뷰이름을 dispatcher-serverlet에게 리턴합니다.
4.반환된 뷰이름을 뷰 리졸버가 찾아서 디스패처서블릿에게 주고
5.모델앤뷰 객체를 뷰와 함께 렌더링한후 최종적으로 컨텐츠를 클라이언트에게 전달합니다.
@Autowired
의존 객체의 타입에 해당하는 빈(Bean)을 찾아 주입하는 역할을 한다.
빈의 라이프 사이클
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백(다른 함수가 작동을 끝마친 후에 작동하도록 되어있는 함수) -> 사용 -> 소멸 전 콜백 -> 스프링 종료
ORM
RDB를 객체지향적으로 조작할수 있도록 매핑해주는 개념, 프레임워크
MVC패턴이란
Model View Controller로 나누어 애플리케이션의 시각적인 요소와 비즈니스 로직을 서로의 영향 없이 수정이 가능한 구조적 패턴이다.
컨트롤러: HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.
모델: 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.
뷰: 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중합니다.
필터와 인터셉터의 차이가 뭔가요
Filter는 Spring Context 외부에 존재하여 요청 정보를 검증하거나 추가합니다 그리고 필터가 호출된 후에 서블릿이 호출됩니다. Interceptor는 인터셉터는 DispatcherServlet에서 핸들러 매핑을 지나, 컨트롤러로 요청을 전달할 때 중간에 요청을 가로채서 특별한 처리를 해줄 수 있다.