RestController

 

 

 

역할 추가

 

CREATE TABLE user(
	id int auto_increment primary key,
    username varchar(100) unique not null,
    password varchar(100) not null,
    email varchar(100),
    profile varchar(200),
    role VARCHAR(50),
    createDate timestamp
) engine=InnoDB default charset=utf8;

CREATE TABLE post(
	id int auto_increment primary key,
    title varchar(100) not null,
    content longtext,
    userId int,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null
) engine=InnoDB default charset=utf8;

CREATE TABLE comment(
	id int auto_increment primary key,
    userId int,
    postId int,
    content varchar(300) not null,
    createDate timestamp,
    foreign key (userId) references user (id) on delete set null,
    foreign key (postId) references post (id) on delete cascade
) engine=InnoDB default charset=utf8;

 

 

 

매퍼

 

 

 

회원가입하고 DB에서 root 어드민으로 변경

(유저롤을 만들 때에는 ROLE_ 을 붙여주는 것이 좋다)

 

 

조건문 없이 삭제 갱신 등을 하면 막는 옵션 체크 해제 

 

 

오토커밋해제 (롤백을 위한)

 

 

---

 

인터셉터

 

 

 

 

 

 

 

 

 

(Dispatcher Servlet에서 스프링으로 보낼때 사이에서 핸들러가 중간에 낄 수 있다.)

핸들러 - 주소매핑

 

 

 

 

 

 

---

디폴트로 만들어진 인터페이스는 구체화하지 않아도 오류가 나지 않는다

---

 

 

 

 

내용변경

 

 

 

 

자동으로 인터셉트한다.

 

추후 webMvcConfigurer 가 다른것으로 바뀐다면 인터셉터에 접근하는 방법을 찾아야한다
(WebFlux 등)

인터셉터 + 필터 = 시큐리티

 

AOP =관점 지향 프로그래밍 - 함수의 직전과 직후를 처리할 수 있다

회원가입
직전 - 유효성체크
본문 - 회원가입
직후 - 세션등록 및 로그인처리

직전과 직후의 부가적인 기능을 밖으로 빼고 본문의 기능(관심 로직)을 작성

부가적인 기능은 [공통적]으로 쓸 수 있게 작성해놓고 사용 !! -> 핵심

 

 

 

 

 

로그인후 이용하면 접속된다

 

 

----------------

Log4J Logger

-------------

 

 

 

 

로그인을 해도 어드민이 아니라면 익셉션

 

 

어드민으로 로그인해서 접속하면

관리자페이지로 접속

 

 

 

 

(이렇게 익셉션별로 구분해야하나 지금은 Exception으로 통일)

 

 

 

 

 

 

 

 

 

 

 

 

IO익셉션으로 설정해놓으면 터진다

 

----------

로그기록 api

https://sentry.io/welcome/

 

Application Monitoring and Error Tracking Software

Self-hosted and cloud-based error monitoring that helps software teams discover, triage, and prioritize errors in real-time.

sentry.io

-----------

 

https://blog.naver.com/getinthere/221718319587

 

springboot 8강 - Spring 인터셉터

인터셉터란 PPT아래와 같이 두 가지만 파일만 정의해주면 된다.config/WebMvcConfig.javaconfig/Ses...

blog.naver.com

 

핸들러는 인터셉터다

 

Spring+HandlerInterceptor.pptx
0.64MB

 

 

 

 

---

컨트롤러 - 뷰리졸버 발동 (@ResponseBody쓰면 미발동)

Rest컨트롤러 - 뷰리졸버 미발동

------

 

Dispatcher Servlet 에서 FrontController 타고 Intercepter가 있으면 탄다

 

 

 

 

 

 

modelAndView 는 JSP에서의 모델이다
response 시 같이 가져가게된다

 

 

프리핸들러 세션 등을 확인

 

 

---

레거시 사용시

web.xml ------- 톰캣 시작시 발동

root-context.xml  -------- 메모리에 딱 1번만 올릴 것들 (DB관련 등) // 톰캣 시작시 발동
servlet-context.xml -------- 요청 올 때마다 메모리에 띄울 것들 // Request할 때 발동된다

----------

aop는 요청시마다 생겨야하니까 servlet-context.xml

----------

 

로그아웃

------------

 

redirect: 를 사용하면 파일이 아닌 주소를 검색한다

 

-----------

 

글쓰기

 

세션 인터셉터에 등록

 

 

 

---------------------

 

 

-------


REST API 주소 설계 방법

주소를 여러개 생성하지 않고도 REST 방식으로 처리 가능

데이터베이스에 접근하는 모든 주소!

SELECT 1건 ------> /post/{id}         (GET)
SELECT ALL ------> /posts             (GET)

INSERT ------> /post                    (POST)

UPDATE ------> /post                   (PUT)

DELETE 1건 ------> /post/{숫자}      (DELETE)
DELETE ALL ------> /posts             (DELETE)

-------

1번 유저가 들고 있는 2번 상품을 1건 확인 ->  /user/1/product/2 (GET)

1번 유저가 들고 있는 2번 상품을 1건 업데이트 ->  /user/1/product/2 (PUT)

1번 유저가 들고 있는 2번 상품을 1건 삭제 ->  /user/1/product/2 (DELETE)

1번 상품을 들고 있는 모든 유저 ->  /product/1/users (GET)

------

쿼리스트링보다 RESTful을 사용하자

---------

autowired 방식

3가지

 

1

 

2

 

3

 

4

 

----------------

 

let index = { // 여기서는 이벤트 리스너를 바인딩만 하고
	init : function() {
		
		$("#btn-save").on("click", ()=> { // 리스너
			this.save(); // 콜백
		});
		
	},
	
	save: function() { // 실제 로직은 여기서 실행
		
		let data ={
				title : $("#title").val(),
				content : $("#content").val(),
				userId : $("#userId").val()
		};
		
		$.ajax({ // 주소는 RESTAPI 방식대로 적어야한다 
			
			type:"post",
			url: "/post",
			data: JSON.stringify(data),
			contentType: "application/json; charset=utf-8",  // http에서는
																// Content-Type
																// 라고 씀
			dataType: "json"  // 스프링은 응답할때 스트링일 경우 무조건 json으로 응답한다
			
		}).done((resp)=>{
			
			alert("글쓰기 성공");
			console.log(resp);
			location.href="/";
			
		}).fail((error)=>{
			
			alert("글쓰기 실패");
			console.log(error);
			
		});
		
	}
}

index.init();

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts