Role 사용하기(1)

1) 작업 과정

  1. 데이터베이스 변경 → role 필드 추가
  2. UserDetails 구현체에 권한 불러와 적용
  3. 권한별 URL 접근 제한
  • 제일 낮은 권한 ROLE_USER, 높은 권한 ROLE_ADMIN
  • 한 사람이 여러개의 권한을 가지려면 매핑 테이블을 만들어서 써야한다.
  • 회원정보 - 매핑 - 권한

클래스에도 url 붙일 수 있다

1) /chat/list 와 /chat/{id}/detail

  • 클래스 url /a
  • 메소드 url /b
    -> /a/b 이런식으로 주소가 된다.
  • 이런식으로 할 수 있다! 보통 이런 거는 권한을 하려고 세팅하는 것!
  • WebSecurityConfig에 .requestMatchers("/admin/**").hasRole("ADMIN") 코드 추가
package com.gn.mvc.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.gn.mvc.entity.ChatRoom;
import com.gn.mvc.service.ChatRoomService;

import lombok.RequiredArgsConstructor;



@Controller
@RequestMapping("/chat")
@RequiredArgsConstructor
public class ChatController {
	
	private final ChatRoomService chatRoomService;
	
	
	@GetMapping("/list")
	public String selectChatRoomAll(Model model) {
		List<ChatRoom> resultList = chatRoomService.selectChatRoomAll();
		model.addAttribute("chatRoomList", resultList);
		return "chat/list";
	}
	
	@GetMapping("/{id}/detail")
	public String selectChatRoomOne(@PathVariable("id") Long id, Model model) {
		ChatRoom chatRoom = chatRoomService.selectChatRoomOne(id);
		model.addAttribute("chatRoom", chatRoom);
		return "chat/detail";
	}
	
}

Role 사용하기(2)

1) 권한 검증 테스트

  • 일반 사용자와 관리자가 각각 접근 가능한 페이지 확인
  • 관리자만 접근할 수 있는 경로 설정

env 파일

  • Properties SpringBoot 버전!
  • 민감한 정보들 담는 파일
  • DB 주소, 계정 아이디, 비밀번호 / SMTP 쓴다면 메일 비밀번호 / API키
  • 보안관련 정보들 외부 노출을 막기 위함.
  • git ignore 처리 필수!!!

WebSocket

1) 정의

  • 기존 HTTP 프로토콜은 클라이언트가 요청하면 서버가 응답하는 방식으로 동작
  • 서버가 먼저 데이터를 보내야하는 경우 기존 HTTP 방식을 사용할 수 없음
  • 클라이언트와 서버 간의 양방향 통신을 제공하는 Websocket이 필요함

2)사용 이유

  • 실시간 데이터 전송
  • 네트워크 부하 감소
  • 서버에서 클라이언트로 즉시 알림 가능
  • 주기적으로 요청을 보내는 방식(Polling)(내가 세미때 했던 채팅방 원리) 보다 Websocket이 빠르고 효율적이다.

WebSoket 사용 방법

프론트 - 중간 - 백엔드
세 곳에서 웹소켓 다루는 것이 필요하다.

  1. 백엔드! BasicWebSocketHandler 메소드 3종 설명!
    1) afterConnectionEstablished - 새로운 WebSocket이 연결(open)된 순간 동작하는 메소드
    2) handleTextMessage - 클라이언트 -> 서버. 클라이언트가 서버에게 메세지를 보내는(send) 순간
    3) afterConnectionClosed - // WebSocket 연결 끊겼을 때
    @Component bean으로 등록하는 방법 중 하나 - 나중에 찾아보기!
    @NoArgsConstructor
    두가지 어노테이션 - 중간다리와 연결을 위해 쓴다. 바깥쪽에서 가져다 쓸 수 있게!

  2. 프론트! home.html
    백엔드와 연결하는 url 써주기 - ws://localhost:8080/ws/basic
    프로토콜 중에
    http는 요청이 있을 때 반응하는 통신방식
    ws는 계속 뚫려있는 터널

  3. 여기는 중간다리! WebSocketConfig
    @Configuration - 환경설정 파일이다.
    @EnableWebSocket - 웹 소켓에 대한
    두가지 어노테이션 필요
    @RequiredArgsConstructor BasicWebSocketHandler 가져다 쓰기 위해 필요
    클라이언트가 요청한 연결 - basicWebSocketHandler를 연결하기 위해 중간다리에서 registerWebSocketHandlers 메소드 쓴다.
    setAllowedOrigins 통신을 하고 있는 도메인을 뜻함.

2) 문제 상황

(1) 보낸 사람과 받는 사람 구분

  • 현재 구현된 코드(detail.html)에는 메시지가 누구로부터 왔는지 정보가 부족함
  • 메시지를 보낼때(ChatWebSocketHandler) 작성자 정보 포함해야함
  • 클라이언트에서 작성자 정보를 받아서 오른쪽/ 왼쪽 정렬

(2) 사용자가 어떤 채팅방에 있는지 고려되지 않음

  • 현재 코드에서는 모든 메시지가 WebSocket을 통해 단순히 수신자 ID를 기준으로 전송
  • A 사용자가 1번 채팅방에 있을 때, 다른 채팅방(2번)에서 발생한 메시지도 보이게 됨
  • 사용자가 어느 채팅방에 접속해 있는지 상태를 저장
  • 해당 채팅방에 해당하는 메시지만 표시

ObjectMapper

Jackson 라이브러리에서 제공하는 Java객체와 JSON간의 변환 담당하는 클래스
객체->JSON로, JSON->객체로 손쉽게 변환 가능(파싱!)
웹소켓에서 데이터를 객체 형태로 주고 받을 때 많이 사용

JSON -> Java 객체(DTO)

ObjectMapper objectMapper = new ObjectMapper();
ChatMessageDto chatMessage = objectMapper.readValue(json이름, ChatMessageDto.class);

Java -> JSON


ChatMessageDto chatMessage = new ChatMessageDto("1","2","가나다");
String json = objectMapper.writeValueAsString(chatMessage);

html -> websocketconfig에서 url 받아서 handler에서 할거다~ 알게됨

profile
함께 공부해요!

0개의 댓글