[2023.12.28] 개발자 교육 68일 차 : 강의-Spring Boot 실습 [구디 아카데미]

DaramGee·2023년 12월 28일
0

복습

쿠키!

✅ 클라이언트 측에 저장되는 작은 데이터 조각이며, 보통 사용자 정보를 유지하거나 상태를 추적하는 데 사용


  • 쿠키를 이용한다?

  • 페이지끼리(싱글페이지) 정보를 공유할 때(forward방식) 이용하는 방법 중 하나
  • 예 : 로그인 후 화면을 전환할 때, 로그인된 정보가 PC(로컬)에 저장되어 공유될 수 있도록 한다.
  • 쿠키 사용하기

  1. SetCookie.java
  • 쿠키 생성 : 쿠키(쿠키이름, 쿠키값(문자열 형태) -> 같은 이름으로 만들면 덮어짐
  • 유효시간 : 상대시간(setMaxAge()) / 절대시간
  • 쿠키 브라우저로 전송 : response.addCookie(c) 쿠키는 클라이언트 pc에 저장되는 값이기 때문에 사용하기 위해서는 반드시 브라우저로 전송하는 작업이 필요함!
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<%  
    Cookie c_name = new Cookie("ename", "smith");  
    c_name.setMaxAge(1200);  
    Cookie c_name2 = new Cookie("ename2", "scott");  
    c_name.setMaxAge(1200);  
    response.addCookie(c_name);  
    response.addCookie(c_name2);  
%>
  1. 쿠키 읽어오기 GetCookie.java
  • 서버에서 브라우저에 쿠키 요청 : Cookie[] cookies = req.getCookie() & 배열의 형태로 쿠키 저장
  • 이메일 정보 기록하기
  1. 쿠키 삭제하기
  • 별도의 메소드는 없으며, 쿠키 유효기간을 0으로 주면 쿠키는 삭제가 됨.
  • 개발자센터에서 삭제여부를 확인할 수 있다.
  • 단, 쿠키는 클라이언트에 기록되기 떄문에 삭제할 때 생성한 쿠키를 클라이언트로 addCookie하지 않으면 적용 x
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>  
<%  
    Cookie c_name = new Cookie("ename", "");  
    c_name.setMaxAge(0);  
    Cookie c_name2 = new Cookie("ename2", "");  
    c_name.setMaxAge(0);  
    response.addCookie(c_name);  
    response.addCookie(c_name2);  
%>

[!tip] 쿠키는?
여러개를 생성할 수 있으며, 그 값은 문자열만 올 수 있고, 유효시간을 설정하여 로컬에 저장이 된다.
로컬에 저장된 것을 반드시 클라이언트에 전송해야 함. addCookie()
다른 경로에 있는 쿠키를 가져오기 위해서는 setPath()로 경로를 설정하는 것이 필요하다.

세션!

메서드기능
void setAttribute(String name, Object value)세션에 name-value 쌍의 데이터를 저장
Object getAttribute(String name)세션에 저장된 데이터를 리턴
Enumeration getAttributeNames()세션에 저장된 데이터의 name 목록을 Enumeration 타입으로 리턴
void removeAttribute(String name)세션에 저장된 데이터를 삭제
String getId()생성된 세션 객체의 세션 ID를 리턴
boolean isNew()처음 생성된 세션인지를 리턴
long getCreationTime()세션이 생성된 시간을 리턴
long getLastAccessTime()마지막으로 세션이 사용된 시간을 리턴
void setMaxInactiveInterval(int second)브라우저가 서버에 아무런 요청을 하지 않을 때, 얼마까지 세션을 유지할 것인지를 설정 (기본 30분)
int getMaxInactiveInterval()설정된 세션의 유효시간을 리턴
void invalidate()브라우저와 매핑된 세션을 강제로 종료

컨트롤계층 지원 어노테이션!

컨트롤계층 지원 어노테이션 -> 웹 요청을 받고 해당 요청에 대해 적절한 응답을 반환하는 역할

@Controller -> 페이지로 출력

  • 메소드 이름이 페이지 이름이 됨.
  • 화면 직접 처리 시 사용
  • Model 클래스와 함께 사용
  • @RequestMapping + @ Controller -> WebServlet임!

@RestController -> 문자열로 출력

  • [[mime type]] : text/plain or application/json인 경우 사용(페이지 출력 아닌 모든 경우) <- Model 사용 필요 x
  • back front의 완전한 분리를 지원하는 설계
  • UI, [[JSON]] 활용 필요 시 사용

컨트롤 계층 리턴타입은 String -> (mapping 안에 있는 url을 통해 메소드를 호출한다.)
단, 메소드 안에서 forward 방식으로 다른 메소드 호출하는 것 불가(왜? forward에서 forward 불가,
redirect에서 forward 가능)

매핑처리

  • @GetMapping

  • 메소드마다 url 매핑하는 어노테이션! & 매핑된 메소드 실행

  • @PostMapping

  • 바디에 넣어 전송할 때 필요

  • 주로 데이터 생성, 수정 시 사용

  • @PathVariable

  • 해쉬값을 넘겨서 처리하는 방법을 지원

  • 보안이슈, 한글처리 이슈 발생할 수 있음.


JSP 기본객체(scope)

✅ JSP 스코프에는 Page, Rquest, Session, Application이 있음. 변수의 생존 기간을 제어한다.


    1. page(pageContext) : 단 하나
      - 하나의 JSP페이지
      - 페이지는 하나의 JSP이므로, 한 페이지에서 다른 페이지의 정보를 사용할 수 없다.
    1. [[request]]
      - 하나의 http요청 정보
      - 클라이언트로부터 오는 한번의 요청과 관련된 영역으로, 브라우저가 결과를 받으면 요청했던 request객체는 사라짐.
      - 하나의 요청 처리하는데 모든 JSP를 포함한다.
      - Request객체 - 웹 브라우저에 웹 사이트 주소 입력하면, 웹 브라우저는 해당 웹 서버에 연결 후 요청 정보 전송함.
      - Request객체는 JSP페이지에서 가장 많이 사용되는 기본 객체
    1. [[Session]]
      - 하나의 브라우저
      - 세션은 하나의 브라우저(Chrome, Internet, Microsoft Edge 등) 내에서만 정보/값 공유한다.
      - 주로 로그인 정보/상태를 유지할때 사용함.
    1. application
      - 하나의 웹 애플리케이션
      - 애플리케이션은 모든 유저, 모든 페이지, 페이지 요청, 세션에 공유될 수 있음.
      - 위의 예제를 통해 application기본객체는 서로 다른 JSP에서도 정보/값을 공유하고 있음
      - (모든 JSP에서 사용가능)을 알 수 있다!

강의 내용

게시판 구현

  • 코드 설계

  • getParameter에 들어오는 값은 이름(name)만 처리 가능, id는 불가(`)

  • 화면구성

  • jsp에 구현된 modal인가, 아닌가 -> 모달에서 사용하는 아이디가 jsp에서 동시에 사용은 불가!!

  • 왜? id는 문서 전체에서 고유해야하며, 중복되어 사용할 수 없음.

  • 데이터 전송 방식

  • Post 방식 : body에 데이터를 담아서 전송(x-www~~ (form 형식), row(Object 형식) 등)
    - @PostMapping : Post 요청이 들어올 때 메소드 실행(주로 데이터 생성, 수정 용도)
    - @RequestBody 주로 사용 : 본문에 담긴 데이터를 객체로 변환할 때 주로 사용

  • get방식 : url을 통한 데이터 전송(길이제한, 인터셉트 가능성)
    - @GetMapping : get요청 처리 메소드에 사용
    - @RequestParam : Get 방식에서 주로 사용, 쿼리 파라미터 추출 시 사용

  • input type="button"
    - 어디로 전송? action의 url로 이동(NoticeController 메소드 호출 - Mapping 되어있어야 함. )
    - submit(역할: 전송)이 아니어서 별도 사용 필요 (Input type = "submit"이 아니기 때문에)
const noticeInsert = () => {  
    console.log("noticeInsert()");  
    document.querySelector("#f_notice").submit();  
};

게시판 기능

  • 테이블을 클래스 설계로 바꿀 수 있어야 한다.

  • Insert

  • jsp -> jsp -> action->jsp
  • Delete

  • 리턴타입 N_no로 수정 -> logic, dao, xml까지 수정
  • jsp{noticeDetail.jsp} -> action(delete(int n_no):int) -> delete결과 1이면 전체조회로 Redirect ->action(select - n건 n_no=null)목록조회 jsp
  • Update

  • 디테일로 이동하며, 오라클은 이미 경유했음. 따라서 수정하는 모달창은 db를 경유하지 않는다.(상세보기에서 받은 데이터셋을 모달창에 띄운다)
  • action(select 1) - jsp(detail & modal) - action(update) - action(update)

그룹웨어 설계 시

  • 권한

  • 관리자/사용자 구분하여 설계 필요
  • 관리자 : 권한에 따라 접근가능 페이지, 결재, 메뉴 다르게 설정

카카오 로그인 API 마무리

  • 클래스 구성

  • OAuthToken.java : VO 생성하여 카카오로부터 받은 토큰을 저장할 수 있도록 @Data 처리함.
  • loginForm.jsp : 카카오 로그인 이미지 및 로그인요청 a태그로 넣기(kakao_login_medium_narrow.png)
  • KakaoController.java :
    - 로그인창에서 인가코드 요청 이후 @ResponseBody를 통해 인가코드를 콜백주소를 통해 파라미터로 받기
    - 인가코드와 헤더를 담아서 토큰 발급을 요청함.
    - 콜백주소로 토큰을 OAthToken에 JSON형태로 저장해둠.
    - 저장해 둔 토큰을 이용하여 사용자 정보를 요청함.
  • KakaoProfile.java :
    - 내부클래스 : KakaoAccount / Properties / Profile -> 접근하기 위해선 한 번 걸러서 가져와야 함.
    - 사용자정보를 가져와서 담아두는 클래스
    - +가져오는 정보는 Session에 저장될 수 있도록 설정하기(기본 30분 저장됨.->서버의 web.xml에 있는 내용)
    - Index.jsp 쪽에 로그인 후의 진행에 대한 코드 입력
      
  • 사용자 정보 가져오기

HttpHeaders headers2 = new HttpHeaders();  
headers2.add("Authorization","Bearer "+oat.getAccess_token());  
headers2.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");  
//HttpHeader와 HttpBody를 하나의 오브젝트에 담기  
HttpEntity<MultiValueMap<String, String>> profileRequest = new HttpEntity<>(headers2);  
RestTemplate rt2 = new RestTemplate();  
ResponseEntity<String> response2 = rt2.exchange("https://kapi.kakao.com/v2/user/me", HttpMethod.POST, profileRequest, String.class);  

Gson g2 = new Gson();  
KakaoProfile kkp = g2.fromJson(response2.getBody(), KakaoProfile.class);  
logger.info("카카오 아이디(번호) : " + kkp.getId());  
logger.info("카카오 이메일 : " + kkp.getKakao_account().getEmail());  
logger.info("카카오 유저네임 : " + kkp.getProperties().getNickname());  
session.setAttribute("nickname",kkp.getProperties().getNickname());  
return "redirect:/index.jsp"; //WEB-INF/views/index.jsp  
    }
  • 로그아웃 처리하기(세션 지우기)

@GetMapping("logout")  
public String logout(HttpSession session){  
    //로그아웃 후 세션 지우기  
    session.invalidate();  
    return "redirect:/index.jsp";  
}

  • 비동기처리 (p.1045 ~ p 1055)![[비동기처리]]


  • Front & Back 상호작용

  • [[REST]]는 Ajax기능과 많이 사용됨. 메소드의 리턴타입이 문자열일 때 @ResponseBody를 써야 함!!

  • front back이 만나는 부분, 초보의 경우, url이 아닌 리턴을 jsp로만 작성

  • (https://api.jquery.com/jQuery.ajax/#jQuery-ajax-url-settings)


로그인 정보 쿠키에 기억하기

  • AuthController

  • @PostMapping 방식으로 string 리턴타입으로 메소드 생성 ()
  • 쿠키 생성 : Cookie 생성 -> 경로 설정 setPath("/"), 유효시간 설정(60x60), 클라이언트단 전송
  • 쿠키 삭제 : 쿠키생성(이름 빈 값) -> 경로상관 x, 유효기간 설정(0) , 클라이언트단 전송

강의 마무리

  • 회원관리 메뉴 추가(회원가입 처리)

  • 인증과 인가 구현을 위한 사전 준비를 해 본다

  • 인증과 인가와 관련된 API를 학습하고 활용해 본다

  • 쿠키와 세션을 활용할 수 있다

  • 실습 개요

  • 소셜 로그인 성공 한 사람을 자동으로 회원가입 처리 해주기를 요구하고 있다.

  • 소셜 로그인이 아닌 일반 회원가입자도 회원관리 해줘야 한다.

  • 구글인증이나 카카오인증 처리를 해 보고 제공되는 프로필 정보를 고려하여 테이블 설계를 해보세요.

  • 오라클 테이블 설계해 보기

create table member231228(

)
  • 클래스 설계하기

  • member 폴더 추가(webapp & WEB-INF)
  • MemberController.java
  • MemberLogic.java
  • MemberDao.java
  • MemberVO231228 - lombok
  • member.xml - MyBatis 연결, 빈 값으로 두면 유효성 검사에서 걸릴 수 있음.
    - POJO에서는 configuration 에서 해당 xml 들을 등록해야 할 수 있었음 .
    - 이를 spring에서 보다 쉽게 구현할 수 있게 해 줌. (xml에 대한 저장 -> DatabaseConfiguration.java)

0개의 댓글