**@RestController
=> Spring4.0 부터 제공하는 Controller
=> 요청 처리 메소드에서 String 리턴시 String을 그대로 클라이언트에게 전송
- DTO 또는 Map 그리고 List나 배열을 리턴하면 JSON형식으로 변환하여 클라이언트에게 전송
=> String을 리턴하는 경우 csv를 제공하고자 하는 경우이고 그 이외 자료형은 JSON
**ajax(Asynchronous JAvascript Xml)
=> 비동기적으로 서버의 데이터를 가져와서 사용
=> 전체화면 갱신 없이 데이터를 가져와서 화면의 일부분을 수정하기 위해서 주로 사용
- 모바일처럼 네트워크 안정성 담보 불가능 상황의 경우, 전체화면 갱신하는 도중 네트워크 해제시 화면 출력 불가
- ajax를 이용하면 서버의 데이터를 가져와서 출력하는 부분은 나중에 보여지고 다른 부분은 계속 출력
- 가져와야 하는 데이터가 많은 경우, 전체 화면갱신의 형태사용시 데이터를 전부 가져올때 까지 화면 출력 불가
=> 최근에는 SPA(하나의 페이지로 모든 콘텐츠를 제공 - Single Page Application)가 유행인데 ajax를 기반으로 생성
**Marshalling
=> RPC(Remote Procedure Call) : 원격에 있는 프로시저를 호출
=> 대표적인 RPC가 Web Server
**XML 출력
=> Marshalling View를 이용하여 XML 형식으로 가능
=> 아직도 RSS에서는 xml을 주로 이용
(RSS - Rich Site Summary - 뉴스, 블로그처럼 실시간으로 변경되는 데이터를 제공하는 콘텐츠 표현방식)
=> 직접 서버를 만든다면 JSON을 이용하는 것이 효율적
=> XML Parsing은 반드시 해 두어야 함
=> Backend 개발자는 데이터를 생성하는 것과 파싱하는 것을 모두 할 수 있어야 함(CSV, XML, JSON)
=> Front End 개발자는 데이터 파싱을 할수 있어야 함
=> XML을 출력할 때는 DTO 클래스에 출력할 속성을 설정
- DTO 클래스의 List를 갖는 별도의 클래스를 생성하여 데이터를 저장 Marshalling View로
**Error
1. 물리적 에러 : 문법 오류로 인해서 애플리케이션이 실행이 안되는 것
=> 대다수의 IDE는 문법오류 발생시 오류에러 표시를 출력
=> 컴파일을 하고 실행되는 언어들은 IDE가 코드를 작성하면 그때 컴파일을 해보고 오류표시를 해줌
- 소스파일 작성후 ClassNotFoundException 발생시 IDE가 컴파일을 못한 것이므로 클래스를 지우고 다시 생성
=> 컴파일 없이 한줄씩 읽으며 실행하는 스크립트 언어들은 IDE에서 에러 표시를 하지 않음
=> 이 경우 소스코드를 읽어가면서 에러나는 부분을 직접 수정
2. 논리적 에러 : 문법상의 오류는 없어 실행은 되지만 결과가 예상과 다르게 나오는 것
=> 로직을 잘못 설계하여 발생하는 에러이므로 디버깅(메모리의 값들을 확인)하여 잘못된 로직을 수정
3. 예외(Exception) : 문법상의 오류가 없어 실행되지만 특수한 상황이 발생하면 프로그램이 중단되는 것
=> 예외 메시지를 읽고 수정해야 함
=> 소스코드에서 이런 문제 발생시 예외처리하여 예외가 발생시에도 계속 수행하도록할지 결정
- 이런 예외는 별도의 파일에 기록 해두는 것이 좋음
- 개발자가 해결가능 예외, 불가능 예외가 있는데 불가능 예외의 경우 다른 방법으로 해결해야 하므로 기록이 필요
//if문처럼 동작 - catch는 여러개 생성 가능
try{
예외가 발생할 가능성이 있는 코드
}catch(예외변수){
예외가 발생했을 때 수행할 내용
}finally{
예외여부에 상관없이 수행할 내용
}
4. 단언(Assertion) : 특수한 상황이 발생하면 강제로 예외를 발생시켜 애플리케이션을 중지시키는 것
=> 조건을 만족하는 경우에만 애플리케이션이 수행되도록 하는 것
**Web에서의 예외 처리
=> Web Page에서는 예외 발생시 WAS가 가지고 있는 예외 페이지가 출력되도록 되어있음
=> 되도록이면 예외 발생시 별도의 페이지를 출력해주는 것이 좋음
**Server에서의 예외 처리
=> 데이터를 넘겨주는 서버 구축시, 예외발생, 잘못된 파라미터 대입시 해당하는 데이터를 만들어 주는 것이 좋음
**Web Programming에서의 예외 페이지를 출력
1. jsp 페이지나 web.xml 파일에 예외가 발생하면 보여질 페이지를 설정
2. Controller에서 예외가 발생했을 때 사용할 페이지를 직접 설정
=> @ExceptionHandler 어노테이션을 이용
**Error 페이지 작성
=> jsp 파일에서는 isErrorPage 속성을 true로 설정하면 exception 객체를 사용할 수 있는 페이지가 됨
=> IE 하위버전에서는 에러페이지의 내용이 512바이트가 안되면 IE 자체 에러페이지를 출력
- edge는 다른 브라우저와 동일하게 처리
**변경 가능성이 있는 문자열 작성
1. Java에서 작성된 경우 : 문자열 변경시 compile, build, run을 전부 다시 수행
2. 일반 텍스트 파일에 작성된 경우 : 문자열 변경시 run만 다시 수행
3. 데이터베이스에 저장해서 읽어서 출력하는 경우 : 아무것도 할 필요 없음 - 대신 읽어올때 느림
**지역화 코드
=> 언어코드_국가코드
- ko_kr - 대한민국
- en_us - 미국
=> 대다수의 API에서는 지역화를 할 때 기본 이름에 _언어코드나 국가코드를 설정
**유효성 검사 - Validation Check
1. 클라이언트 사이드
=> 웹의 경우는 서버에게 데이터를 전송하기 전에 파라미터의 유효성을 체크
=> 응답이 빠름, 서버의 트래픽을 줄일수 있음
=> 보안이 취약
=> 클라이언트 사이드의 코드는 유저가 확인 가능
=> 코드의 난독화를 이용해서 보안을 유지
- 의미없는 주석을 추가하거나 공백이나 엔터를 제거해서 수행
=> 웹의 경우는 HTML5의 속성이나 자바 스크립트를 이용해서 수행
2. 서버 사이드
=> 클라이언트가 서버에게 데이터를 넘겨주는 시점에 수행
=> 보안이 필요한 데이터는 무조건 서버에서 유효성 검사를 수행
- 데이터는 네트워크를 이용해서 전송시 변질의 위험이 있음
=> SQL의 매개변수로 사용되는 데이터는 반드시 데이터베이스 작업전에 유효성 검사를 해야함
=> 암호화를 하지 않은 상태에서 로그인처리
select email, pw
from user
where email = #{email} and pw = #{pw};
위의 경우 비밀번호를 ddd or 1=1 형태로 대입하면 결과가 true
=> 비밀번호는 복호화가 불가능한 암호화를 이용해서 저장, DB가 아니라 Service에서 비교하도록 만들어야 함
3. 데이터베이스
=> 제약조건을 이용해서 유효성을 검사
* 유효성검사는 속도가 좀 느려지더라도 여러번 수행하는 것이 좋음
* Spring에서의 유효성 검사는 서버에서 수행
**primary key나 unique 한 데이터의 중복 검사는 서버를 이용
=> 초창기에는 팝업창을 이용하여 이러한 작업을 수행
- 그 이후에는 ajax를 이용하여 검사를 수행
- 최근에는 데이터를 전송할 떄 서버에서 수행하는 형태로 변경
**Spring에서의 유효성 검사
=> Validator 인터페이스와 Erros 그리고 BindingResult 클래스를 이용하여 유효성 검사를 수행
1. Validator 인터페이스는 유효성 검사를 수행해주는 메소드를 소유한 인터페이스
=> 유효성 검사를 수행하고자 하는 경우 Validator 인터페이스를 상속받는 크랠스를 생성
1) public boolean supports(Class <?> clazz)
=> 유효성 검사 수행 DTO 클래스.class.isAssignableFrom(clazz)를 호출하여 리턴
2) public void validate(Object target, Errors errors)
=> 이 메소드에서 target을 DTO 클래스로 형변환하고 필요한 검사를 하고 errors에 에러메시지 설정
2. Member 클래스의 유효성 검사 클래스
public class MemberValidator implements Validator{
public boolean supports(Class <?> clazz){
return Member.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors){
Member member = (Member)target;
if(member.getEmail() == null){
errors.rejectValue("email", "메시지이름");
}
}
**Web site를 위한 서버, REST API 서버
=> Web site를 위한 서버 : 서버가 많은 일을 수행, spring 유효성 검사를 사용
=> REST API 서버 : 클라이언트가 많은 일을 수행, Spring 유효성 검사가 아닌 일반 로직으로 유효성 검사 수행
'수업 정리' 카테고리의 다른 글
68일차 수업 정리(Android 구조 및 화면 출력) (0) | 2020.07.13 |
---|---|
67일차 수업정리(텍스트 파일보고 다시 정리) (0) | 2020.07.10 |
63~65일차 수업 정리(Spring MVC Project 외 정리) (0) | 2020.07.08 |
63~66일차 수업 정리(Spring MVC Project) (0) | 2020.07.07 |
63일차 수업 정리(Spring - MVC패턴) (0) | 2020.07.06 |