본문 바로가기

백엔드 개발/SpringMVC

@RequestMapping More , 인코딩의 원리

1. @RequestingMapping more

(1) RequestMethod가 다르면 같은 URL 주소를 가져도 된다.

@RequestMapping만 하던 시절에는 매소드 간에 매핑 URL 주소가 같으면 에러가 났다. 하지만 @PostMapping과 @GetMapping은  서로 하는 작업이 다르기 때문에  URL 주소가 같아도 된다.

@GET은 서버에서 정보를 얻어오는 거고, @Post는 정보를 서버의 데이터에 기록하는 것이다.

(2)하나의 컨트롤 내 매소드 간에 동일한 주소는 @RequestMapping을 써 묶어줄 수 있다.

@Contorller 밑, 클래스 이름 위에 @RequestMapping을 써서 중복되는 주소는 묶어줄 수 있다. 

이러면 매소드 별로 매핑된 주소가 정말 적고, 무슨 일 하려는지 단박에 알 수 있어 가독성이 좋아진다.

2. URL 인코딩의 원리 

(1)URL 인코딩이란? 

 URL 인코딩이란 URL의 적힌 내용을 암호화 하는 것이다. URL 인코딩은 퍼센트 인코딩인데 그 이유는 암호화 시 % 기호를 많이 쓰기 때문이다.

(2)인코딩 디코딩 쓰는 이유 

이유는 다음과 같다. 

각 나라별로 많이 쓰이는 OS와 언어가 다르다. 하지만 브라우저는 전 세계 어디서든 요청이 와도 돌아가야 한다. 

요청 들어온 OS가 아랍 OS 라고, 요청으로 들어온 말이 한국어라고 오류가 나선 안된다. 

따라서 브라우저는 요청을 세계의 모든 국가가 온라인에서 공통으로 쓰는 ASCII 코드로 요청 사항을 암호화 한다. 

 

어떤 요청이 들어오면 브라우저가 해당 요청을 인코딩하고 처리 결과는 다시 디코딩 되어 사용자에 맞게 보여준다.  

(3) 인코딩의 원리 

     a. 요청 하나를 인코딩 하는 경우

  알다시피, 코딩에서 문자는 숫자로 되어있다. char 'A'를 int로 형변환 하면 65가 찍힌다. A의 ASCII 코드 가 65이기 떄문이다.  인코딩은 이런 문자의 코드들을 16진법으로 바꾼 뒤에 문자열 속에 넣어 브라우저로 보낸다. 

ex) '남' 의 아스키 코드 == 0xEB82A8 -> 인코딩 -> "0xEB82A8"

       ** Base64와의 차이점 

Base64는 바이너리 데이터들을 6bit씩 끊어서 a-z A-Z 0-9 의 텍스트로 변환하는 작업이다. 

이를 통해 HTTP에서도 바이너리 데이터들을 변환하여 쓸 수 있게 해주었다. 

 

인코딩은 이와 상관 없는 개념으로 

브라우저가 요청 사항을 코드에서 문자열로 변환하여 서버로 보내는 것이다.

     b. 브라우저에서 서버로 넘어가는 전체적인 흐름 

브라우저가 요청 사항을 코드에서 문자열로 바꾸어 서버로 보낸다. 

서버는 해당 요청사항을 디코딩 하여 뭔 내용인지 알아낸뒤 작업 후 처리 결과를 다시 브라우저로 보낸다. 

 

이때 두 기관 간에 암호화, 해독 시 사용하는 기계가 같아야 한다. 

브라우저는 EUC-KR 쓰는데, 서버는 utf-8 쓰면 내용이 다 깨져서 서버에 전달되기에 제대로된 처리 작업을 할 수가 없다.

(번외) sts에서 스프링 작업 시 알 수없는 오류가 많이 발생한다. 이 경우 대다수가 우리가 의존하고 있는 모듈간의 충돌로 인한 것인데 이걸 고칠 수 있는 방법은? 

이 경우 로컬C ->  사용자 -> 내 계정 -> .m2 -> repository를 삭제 해버리자.

 

3. 스스로 해보기

	
@Controller
@RequestMapping("/register")
public class RegisterController {
    
    
    
    
    @GetMapping("/add") // 신규회원 가입 화면
	public String register(){
		return "registerForm";
		
	}
    
    
    
    @PostMapping("/save")
	public String save(User user, Model m) throws Exception {
		// 1. 유효성 검사 
		if(!isValid(user)) {
			String msg = URLEncoder.encode("id를 잘못 입력하셨습니다.", "utf-8");
			
			m.addAttribute("msg",msg);
			return "redirect:/register/add";
			
		}

		return "registerinfo";
	}

		private boolean isValid(User user) {
			return false;
		}
	}
}

 

 

 

'백엔드 개발 > SpringMVC' 카테고리의 다른 글

쿠키란?  (0) 2023.03.05
Redirect와 Forward에 대하여  (0) 2023.03.04
@ 어노테이션 전문화, view Controller, Redirection  (0) 2023.03.04
회원 가입 화면 작성하기  (0) 2023.03.03
@ModelAttribute 와 WebDataBinder  (0) 2023.03.03