# GET / POST 방식
GET : 클라이언트에서 서버의 리소스를 가져올 때
POST : 클라이언트에서 서버에 데이터를 전송할 때
# Controller
Controller가 뭔지 생소한 분들이 있을 것 같아 간단히 정의하면 다음과 같다.
Controller : 사용자(Client)의 요청(Request)을 어떻게 처리(Handling) 할 지 결정하는 녀석
우리가 User에 대한 컨트롤러를 생성하기 위해서 클래스를 다음과 같이 만들었다.
public class UserController {
}
하지만 스프링은 해당 클래스가 컨트롤러인지 알 수가 없다.
스프링이 컨트롤러로 인식하게 하려면 애노테이션 @Controller를 사용하여야 비로소 이 클래스가 컨트롤러의 역할을 한다는 것을 의미한다.
@Controller
public class UserController {
}
그 후 사용자의 요청을 처리하는 로직을 만들어주면 된다.
@Controller
@RequestMapping("/users")
public class UserController {
@PostMapping("/")
public String create() {
return "index";
}
}
- @RequestMapping("/users") : 기준점을 나타내는 url로 이것을 사용하면 불필요한 중복을 제거할 수 있어 코드가 깔끔해진다.
- public String create() : 메소드 명은 개발자의 취향에 맞춰 지어도 무방하다.
- return "index" : 원래는 'index.html'로 써야하지만 application.properties에서 별도의 설정을 통해서 '.html'을 생략가능 하도록 지정할 수 있다.
# application.properties
설정 파일
여러가지 설정을 지정할 수 있지만 대표적인 설명만 하도록 한다.
server.port=7070 | 포트 번호를 7070으로 변경한다. |
---|---|
handlebars.suffix=.html handlebars.cache=false | html 소스를 수정할 경우 매번 서버를 재시작 해야 하는데 이 설정을 하면 재시작 하지 않아도 변경사항이 적용된다. |
# 인자 개수 줄이기
@PostMapping("/")
public String create(String userId,String password,String name,String email) {
System.out.println("excutecreate!");
System.out.println("userId:" + userId);
System.out.println("password:" + password);
System.out.println("name:" + name);
System.out.println("email:" + email);
return "index";
}
create메서드에는 인자가 4개 있다.
문제)
위와 같이 코딩하면 개발이 진행되면서 메서드의 길이가 계속 늘어나게 된다.
해결)
자바 빈 규약에 따라 User 클래스를 만들어서 따로 빼두면 인자의 개수를 줄일 수 있다.
public class User {
private String userId;
private String password;
private String name;
private String email;
public String getUserId() {
return userId;
}
public void setUserId(StringuserId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(Stringpassword) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(Stringname) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(Stringemail) {
this.email = email;
}
@Override
public String toString() {
return "User{"+
"userId='"+userId+'\''+
",password='"+password+'\''+
",name='"+name+'\''+
",email='"+email+'\''+
'}';
}
}
그 후 컨트롤러에서 다음과 같이 쓰기만 하면 된다.
...
@PostMapping("/")
public String create(User user) {
System.out.println("excutecreate!");
System.out.println("user:" + user);
users.add(user);
return "index";
}
처음 보는 사람들은 위 코드를 보고 "엥?" 싶을 거다.
나 역시 그랬다.
매개변수로 User user를 넘기면 스프링 프레임웍이 자동으로 User 인스턴스를 생성한다.
그 후 User 클래스의 set 메서드를 통해서 값을 저장한다.
★여기서 주의★
- User 인스턴스 변수를 통해서 값을 저장하는 것이 아닌 set메서드를 통해서 값을 저장함에 주의하자.
- User 클래스에 set메서드가 없다면 정상적으로 값을 저장할 수 없다.
- 인스턴스 변수명이 달라도 set메서드명만 같으면 값을 바꿀 수 있다.
# mustache
앞으로 개발을 할 때 HTML을 많이 쓰게 될 텐데 HTML만 쓰면 정적인 데이터밖에 처리하지 못한다.
그것을 동적으로 처리하도록 도와주는 것이 templates 엔진이다.
그 templates 엔진 중 하나가 mustache이다.
다음 html 파일을 보자
{{#users}}
<tr>
<th scope="row">1</th>
<td>{{userId}}</td>
<td>{{name}}</td>
<td>{{email}}</td>
<td><a href="#"class="btnbtn-success"role="button">수정</a></td>
</tr>
{{/users}}
★주의할 점★
{{name}} 은 User 클래스의 name 변수에 접근하는 것이 아니라 getName()으로 접근하는 것임.
따라서 get 메서드를 만들지 않으면 아무리 불러봐도 소용이 없음에 주의하자.
mustache 실습
회원 가입한 사용자 list를 보여주는 역할을 구현해보자.
@GetMapping("/list") // 사용자의 데이터를 가져오므로 get을 씀
public String list() {
return "list";
}
이 후 list.html을 작성한다.
<tbody>
<tr>
<th scope="row">Lime</th>
<td>성건희</td>
<td>lime@naver.com</td>
</tr>
<tr>
<th scope="row">javajigi</th>
<td>자바지기</td>
<td>javajigi@naver.com</td>
</tr>
</tbody>
위 코드는 정적이다.
User 목록을 보여주는 리스트는 회원가입에 따라서 동적으로 바뀌어야 한다.
따라서 다음과 같이 변경한다.
@GetMapping("/list")
public String list(Model model) {
model.addAttribute("users", users);
return "list";
}
<tbody>
{{#users}}
<tr>
<th scope="row">{{userId}}</th>
<td>{{name}}</td>
<td>{{email}}</td>
</tr>
{{/users}}
<tbody>
그런데 위와 같이 데이터를 저장하면 램 메모리상에 데이터가 저장되므로 서버를 재시작하면 데이터가 초기화 되버린다.
램 메모리는 휘발성 메모리로 크기가 작지만, 속도가 빠르다.
위 문제는 데이터베이스에 저장함으로써 해결할 수 있다.
# Model
MVC패턴에서 Model을 매개변수로 넘길 수 있다.
@Controller
public String welcome(String name, Model model) {
model.addAttribute("name", name); // name이라는 이름으로 저장
return "welcome"; // model 데이터를 welcome.html 로 전달
}
- Controller에서 Model에 데이터 저장
- welcome.html인 View로 데이터 전달
# Form 태그의 action 속성
서버에 요청을 보낼 때 어떤 URL 주소로 보낼 거니?
기본값은 get 방식
- 데이터를 요청하거나 가져올 때 사용
method="POST"
- 서버에 데이터를 전송해서 새로운 데이터를 추가하거나 변경할 때 사용
- URL 상에서 데이터가 가려지므로 보안상 안전
'코딩 교육 기관 > 코드스쿼드 백엔드 레벨3' 카테고리의 다른 글
DAY 1 - 1 (10) | 2019.04.17 |
---|
댓글