@RequestMapping(value="", ? )
value외 나오는 것들이 있어요!
client의 request를 제한하는 용도
(서버는 header정보를 보고 request를 제한해요!)
client의 request안의 header정보인 content type정보를 알려줘야해요
우리가 데이터를 보낼때
get : url뒤에 쿼리스트링형태로 데이터를 실어 보냄
post:
- 쓸일이 있나요?
일반적으로는 안써요. 일반적으로 서버쪽으로부터 json데이터만 받겠어할때 즉 에이젝스할때, restAPI설계할때 사용해요
GET방식에서는 의미 없어요.
✔️보통의 Request는 특별한 경우가 아닌 이상 요청을 제한 하는 경우가 많지 않아요
✔️위의 경우 보다는 요청을 처리한 다음 서버에서 데이터를 전달할때 일반적인 html, json, xml인지를 정해줘야 하는 경우가 많아요
즉, content type(header안에 들어있는)을 정해야 할 필요가 있어요
(request/response header안에 들어있음)
형식 : MIME Type(데이터 마다 정해져 있음)
@Controller
public class RequestMappingConsumesContoller {
Logger log = LogManager.getLogger("case3");
@RequestMapping(value = "/testController1",
method = RequestMethod.GET,
consumes = { "apllication/json", "apllication/xml" }) // 특정 데이터 형식을 표현하는 문자열
public String myMethod1() {
log.debug("GET방식으로 호출됨");
return null;
}
@RequestMapping(value = "/testController2",
method = RequestMethod.POST,
consumes = { "apllication/json", "application/x-www-form-urlencoded"}) // 특정 데이터 형식을 표현하는 문자열
public String myMethod2() {
log.debug("POST방식으로 호출됨");
return null;
}
}
client에게 return하는 데이터에게 content type을 지정
서버가 클라이언트에게 데이터를 리턴할때 그 데이터를 해당 타입으로 변환하는건 아니에요
혼자 잘 쓰이진 않아요
@ResponseBody라는 annotation이랑 같이 써요
직접 수동으로 bean을 등록ㅎ하려면
1) 외부 라이브러리를 빈으로 등록해서 효율적 사용 가능
2) 프로그램이 크기가 커지고 자주 기능이 변경되는 경우에는 interface를 기반으루 구현 class를 수동으로 등록해서 전력패턴으로 활용
❓(root)Application Context를 직접 사용하는 방법이 있나요?
@Autowired가 싫어욧
=> 할 수 있어요. 단, 구현체를 만들어야해요
Interface를 제공해줘요 => applicaion context Aware
구현한 구현체를 빈으로 등록해야돼요
@Component //이걸 붙여야 Bean이 돼요
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext ctx;
public static ApplicationContext getApplicationContext() {
return ctx;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// TODO Auto-generated method stub
this.ctx = applicationContext;
}
@RequestMapping(value = "testProduces4", produces = "application/json; charset=UTF-8")
public void method04(HttpServletResponse response) {
try {
response.setContentType("application/json; charset=UTF-8");
PrintWriter out = response.getWriter();
//데이터를 만들어요
Map<String, String> map = new HashMap<String, String>();
map.put("userName", "장진희");
map.put("userAge", "18");
map.put("userAddr", "서울");
//이 데이터를 json문자열로 변환
// Gson gson = new Gson();
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
Gson gson = ctx.getBean("getGson", Gson.class);
String str = gson.toJson(map);
//그리고 스트림을 통해 클라이언트에 전달
out.println(str);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@RequestBody
와 결합해서 사용 시 의미를 가져요HttpRequest
① Start line
POST/Springweb/http
② headers
대표적인게 content type~~
③ Body
HttpResponse
① Status line
상태코드(200,201 created, 404 http 찾을 수 없는, 403fobiden권한x, 415타입 안맞아, 500코드는 ㄱㅊ 프로그램이 이상)
② Header
③ Body
Body를 RequestBody/ResponseBody라고 불러요
객체화 시켜서 우리가 사용해요
일반적인 경우 (JSP 파일 이용)
(그림첨부)
컨트롤러 자체가 문자열로 뷰 네임을 리턴하는 경우
다른 경우
(컨트롤러 자체가 데이터를 리턴하는 경우)
-> rest기반으로 client의 ajax호출에 대한 결과를 return할때
->jsp를 사용하지 않아요(produces속성/@ResponseBody)
viewResolver/model등이 빠짐
(그림첨부)
http, web을 조금 더 잘 사용하기 위한 하나의 규칙
구성요소
1) Resource
서버에 존재하는 모든 자원(파일, 이미지, 문서, 프로그램)
사용 가능한 모든것들의 아이디가 부여됨 =>id가 부여됨 uri로 표현
2) method를 이용한 행위
CRUD
직원 조회 GET
자원 생성 POST
자원 수정 PUT
자원삭제 DELETE
3) 표현 Representation
서버가 처리를 끝내면 적절한 응답을 보내요
json, text, xml ...
❓REST API는 뭐에요?
REST기반으로 Service API를 구현
(ajax를 이용할때
REST API 디자인 가이드
1) URI는 리소스를 표현하는 수단이어야해요
=> 동사가 들어오면 안돼요
ex)GET /member/delete/3(하나의 리소스를 지칭해야하므로 같은 작업을 할때는 member/3 으로 지칭해야됨. GET은 DELETE라는 방식으로 URI를 줘야함)
DELETE member/3
GET /member/3
POST /member
2) URI의 마지막은 "/"로 끝나지 않아요
/member/3(O)
/member/3/(x)
3) 특수문자는 URI에 쓰지 않아요.
/member/student_score(x)
/member/student-score(O)
4) 소문자로만 URI작성
5) 확장자는 URI에 포함하지 않아요
/member/flower.gif ->확장자 accept header에 명시
6) REST의 응답
REST 원칙에 따라 서버를 client에 상태정보를 보내줘야해요
7) REST의 인증
http인증 -> 데이터 암호화 시켜서
key base인증 -> 서버가 client에게 key발급 request마다 key포함
OAuth인증 -> 복잡한 인증 process