스프링 구조
DispatcherServlet
: HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)
: 요청이 오면 실제로 로직을 수행할 컴포넌트로 요청을 보내주고, 반환을 받는 역할
HandlerMapping
: 스프링 프레임워크에 작성된 여러 Controller 중에서 로직을 수행할 Controller 찾아주는 역할
Controller
: 해당 Controller(@RequestMapping("/url"))을 찾아 해당 Controller의 해당 메서드를 인식하고 찾아 요청
Service
: 비지니스 로직을 수행
DAO (Data Access Object)
: Database에 직접적으로 접근하는 객체
ViewResolver
: ViewName을 기반으로 어떤 View 파일을 사용 할 것인지 확인
View
: UI 화면 의미
스프링 부트
Spring MVC
Model
REST API : Representational State Transfer(REST)
Spring MVC 패턴 흐름
웹 브라우저의 요청이 들어오면
DispatcherServlet(Front Controller) ->
HandlerMapping으로 Controller 검색을 요청하고 ->
해당Controller(@RequestMapping("/url"))을 찾아 해당Controller의 해당메서드를 인식하고 찾아 ->
Controller -> Service -> DAO -> DB -> DAO -> Service -> Controller 의 순서로 진행 클라이언트의 요청을 처리하고 결과를 출력할 view와 뷰에 전달할 객체를 담고 있는 Model 객체를 리턴 ->
ViewResolver는 컨트롤러에서 보내온 view(.html)를 클라이언트에게 리턴하여 화면 출력
스프링부트가 로드될때 리소스 경로에있는 application.properties 를 읽어온다
실행이되면서 @어노테이션들을 컨테이너에 집어넣는다 => 그 시점부터는 스프링부트 ioc컨테이너에서 관리가 시작된다
로컬호스트(아이피)8080 서버에 요청이 이루어지고( / 인덱스가 생략된 상태)
server.port=8080
server.servlet.context-path=/
서버 정보를 읽고 디비 정보를 읽고 연결 설정 => 이러한 것들이 로드된 시점에 진행이 되어있는 상태고
url 요청이 들어오면 컨트롤러를 찾게된다
페이지를 던져준다 : 리턴 (스프링에서 알아서 찾아줌)
import org.springframework.ui.Model;
=> 모델에 담아서 model.addAttribute();
=> 클라이언트단으로 던져준다
IoC (Inversion of Controll) 역제어
DI (Dependency Injection) 의존성 주입
외부에서 두 객체 간의 관계를 결정해 주는 디자인 패턴
인터페이스를 사이에 두어 클래스 레벨에서 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 결합도를 낮춘다
(의존성: 한 객체가 다른 객체를 사용할 때)
생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다
Product product = new Pencil();
Store store = new Store(product); // injection
객체들 간에 관계가 맺어졌다면 다른 객체의 구체 클래스(Pencil인지 Food 인지 등)를 전혀 알지 못하더라도,
(해당 클래스가 인터페이스를 구현했다면) 인터페이스의 타입(Product)으로 사용할 수 있다
AOP (Aspect Oriented Programming) 관점 지향 프로그래밍
시스템을 핵심과 공통으로 나눈다
공통사항들을 별도의 클래스에서 정의한다
공통사항들을 별도의 모듈로 설계 구현하여 생산성과 유지보수성을 향상 시키는 것이 목적
스프링에서 제공하는 스프링 AOP는 프락시 기반의 AOP 구현체이다
프록시 객체를 사용하는 것은 접근 제어 및 부가 기능을 추가하기 위해서이다
스프링 AOP는 스프링 Bean에만 적용할 수 있다
스프링 AOP는 순수 자바로 구현되었기 때문에 특별한 컴파일 과정이 필요하지 않다
Proxy 패턴
POJO(Plain Old Java Object)
@Bean
@Component
: 이 애노테이션을 붙이면 spring IoC컨테이너가 객체를 자동 생성
: 생성자의 파라미터 값을 자동으로 주입
: 파라미터에 해당하는 객체가 없다면 생성 오류 발생
클래스를 역할에 따라 좀 더 섬세하게 제어하기 위해 만든 애노테이션
@Controller
@Repository : DAO 역할을 수행하는 객체에 붙인다
@Service : 비지니스 로직 / 데이터 가공 / 트랜잭션을 제어하는 클래스에 붙인다
@RequestParam
: GET 요청 파라미터 전송 방식, HTML Form 전송 방식을 사용할 때에 조회할 수 있는 방법
: @RequestParam("파라미터 이름") 자료형 변수명
@RequestBody / @ResponseBody
: 클라이언트에서 서버에 JSON 형식의 requestBody로 요청 데이터를 전송했을 때, Java에서는 해당 JSON 형식의 데이터를
받기 위해서 JSON -> Java Object로의 변환이 필요
: 마찬가지로 요청된 데이터를 처리 후, 서버에서 클라이언트로 다시 응답 데이터 responseBody를 보낼 때도 Java
Object에서 JSON 또는 XML 같은 형식으로의 변환이 필요
=> 이러한 과정을 해당 어노테이션들이 처리
- @RequestBody
: HttpRequest의 본문 requestBody의 내용을 자바 객체로 매핑하는 역할
: DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는
MessageConverter를 통해 요청 본문인 requestBody를 통째로 변환해서 메서드로 전달
: 일반적인 GET 메서드의 요청 경우에는 HttpRequest의 requestBody로 요청 데이터가 전달되는 것이 아니라,
URI 또는 URL의 파라미터로 전달되기 때문에 @RequestBody 어노테이션을 통해 해당 요청 내용을 받을 수가 없다
-> GET 메서드의 경우 @PathVariable, @RequestParam 등의 어노테이션을 통해서 요청을 전달받아야 합니다.
: 반면에 xml이나 json기반의 메시지를 사용하는 요청의 경우에 이 방법이 매우 유용하다
: HTTP 요청의 바디내용을 통째로 자바객체로 변환해서 매핑된 메소드 파라미터로 전달해준다
- @Responsebody
: return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달
: @RestController 어노테이션을 명시했다면 따로 @ResponseBody 어노테이션을 명시하지 않아도 자동으로
HttpResponse의 본문 responseBody에 자바 객체가 매핑되어 전달
Servlet
클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션
HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다
Java Thread를 이용하여 동작
사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송
요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성
web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다
해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출
doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다
응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다
Dispatcher-Servlet
filter 와 interceptor 차이
filter
interceptor
java
JVM : 자바 가상 머신
OOP (object oriented progrmming)
기계적인 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때도 객체들을 조립해서 작성할 수 있도록 하는 기법
프로그램을 절차(Procedure) 및 데이터로 함께 묶은 객체들의 집합으로 구성
추상화 / 캡슐화 / 다형성 / 상속
다형성 : 하나의 코드를 여러 용도로 쓰이게 하는 것
- 오버로딩 : 매개변수의 타입이나 개수가 다르더라도 같은 기능을 하는 메서드의에 대해 같은 이름을 갖게하는 것
- 오버라이딩: 상위 클래스에서 상속 받은 메서드를 서브 클래스 형식에 맞게 재정의 하는 것
BO, VO, DTO, DAO 설명
DAO(Data Access Object)
DTO(Data Transfer Object)
VO(Value Object)
BO(Business Object)
클래스
객체
인스턴스
예를들어 붕어빵을 만든다고 상황을 가정해보자.
여기서 클래스는 붕어빵을 만들기 위한 틀이 되고 객체는 붕어빵이다.
그리고 인스턴스는 붕어빵 틀로 찍어낸 각각의 붕어빵이다.
팥붕어빵과 슈크림붕어빵은 같은 타입의 객체이지만, 인스턴스 관점으로 보았을 때는 다르다.
제네릭
추상클래스와 인터페이스 차이
공통점
차이점
프로세스
스레드 (경량 프로세스)
멀티 스레드
트랜잭션
java 3대 컬렉션
List 인터페이스
: LinkedList, Stack, Vector, ArrayList
: 순서 O, 데이터 중복 허용 O
Set 인터페이스
: HashSet
: 순서 X, 데이터 중복 허용 X
Map 인터페이스
: Hashtable, HashMap
: 순서 X, key 중복 허용 X, Value 중복 허용 O
Reflection
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다
Class<?> classInfo = class.forName("cname"); // 클래스를 알아낸다
Constructor<?> c = classInfo.getConstructor(); // 생성자를 알아낸다
c.newInstance(); // 생성자를 통해 인스턴스 생성
get / post 방식 차이점
get : 받은 데 이터를 주로 뿌려주고 싶을 때 사용
post : insert / update 등 과같이 데이터의 변경이 일어날 때 사용
ajax : Asynchronous JavaScript and XML
$.ajax ({
url: "url" // 요청이 전송될 URL주소
type: "GET" // http 요청 방식 (default: get)
data: {key, value} // 요청 시 포함될 데이터
dataType: "json" // 응답 데이터 형식 (명시하지 않을 경우 자동으로 추측)
success: function(data, status, xhr) {
// 정상적으로 응답 받았을 경우 success 콜백이 호출
// 이 콜백 함수의 파라미터에서는 응답 바디, 응답 코드, 그리고 XHR 헤더를 확인 할 수 있다
}
error: function(xhr, status, error){
}
JSON (Java Script Object Notation)
세션과 쿠키 차이점
session
방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점까지 상태를 유지시키는 기술
접속한 웹 브라우저의 서버에 저장 : 세션이 생길때마다 서버의 리소스를 차지
세션 아이디는 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장되며 브라우저 종료시 소멸
동작 순서
-> 클라이언트가 페이지에 요청 (사용자가 웹사이트에 접근)
-> 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여,
클라이언트가 해당 session-id를 보냈는지 확인
-> session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려준다
-> 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장
-> 클라이언트는 재접속 시, 이 쿠키를 이용해 session-id 값을 서버에 전달
cookie
사용자가 어떠한 웹 사이트를 방문할 경우,그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장
:서버의 자원을 사용하지 않음
HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용
쿠키 만료 시점은 쿠키 저장시 설정 : cookie.setMaxAge(60 60 24 * 7);
동작 순서
-> 클라이언트가 페이지를 요청 (사용자가 웹사이트에 접근)
-> 웹 서버는 쿠키를 생성
-> 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다
-> 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송
-> 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송
사용 예시
방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
세션과 쿠키를 사용해야하는 이유
프레임워크
라이브러리
프레임워크와 라이브러리의 차이 : 흐름을 누가 가지고 있느냐
JDBC (Java Database Connectivity)
executeUpdate()
executeQuery()
myBatis
log4j : Log for Java
SQL
inner join
: 공통된 부분만 골라 결합 (교집합)
full outer join : 전체 테이블 결합 (합집합)
:mySql에서는 지원하지 않기 때문에
: left join union right join 를 합집합을 이용하여 출력
left (outer) join
: 왼쪽 테이블 기준으로 일치하는 행만 결합되고 일치하지 않는 행은 null값으로 채워짐
right join
: 오른쪽 테이블 기준으로 일치하는 행만 결합되고 일치하지 않는 행은 null값으로 채워짐
Cross join
: 곱집합 (카디션 곱)
insert into 테이블명 ('컬럼'') values('값');
select *(컬럼) from 테이블명 (where 제약 조건);
delete from 테이블명 where 제약조건;
update 테이블 set 컬럼=값 where 제약조건;