본문 바로가기
코딩 교육 기관/코드스쿼드 백엔드 레벨3

DAY 1 - 2

by 성건희 2019. 5. 4.
반응형

# 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 로 전달 
}
  1. Controller에서 Model에 데이터 저장
  2. welcome.html인 View로 데이터 전달

 

# Form 태그의 action 속성

  • 서버에 요청을 보낼 때 어떤 URL 주소로 보낼 거니?

  • 기본값은 get 방식

    • 데이터를 요청하거나 가져올 때 사용
  • method="POST"

    • 서버에 데이터를 전송해서 새로운 데이터를 추가하거나 변경할 때 사용
    • URL 상에서 데이터가 가려지므로 보안상 안전

 

반응형

'코딩 교육 기관 > 코드스쿼드 백엔드 레벨3' 카테고리의 다른 글

DAY 1 - 1  (10) 2019.04.17

댓글