유저조회 API스펙
* 주의점
- 전체를 조회하기 때문에 쿼리는 없습니다.
- @RestController가 있기 때문에, Controller에서 Getter가 있는 객체를 반환하면 JSON 형태가 됩니다.
- id는 각 데이터끼리 겹치지 않는 유일한 고유번호를 의미합니다.
-> List에 담겨 있는 유저의 순서를 id로 해주면 됩니다~!
쉬어가기
Controller에서 Getter가 있는 객체를 반환하면 JSON 형태가 된다는 것을 증명해보겠습니다.
1. UserController (JSON반환 예시)
@GetMapping("/fruit")
public Fruit fruit(){
return new Fruit("바나나", 2000); }
2. Fruit (JSON반환 예시)
package com.group.libraryapp.domain.user;
public class Fruit {
private String name;
private int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
3. 포스트맨의 결과값 (JSON반환 예시)
-> 아래 사진처럼 Controller에서 Getter가 있는 객체를 반환하면 JSON 형태로 반환되는 걸 알 수 있습니다.
계속해서 유저조회 코드를 작성해보겠습니다.
1. UserController
@GetMapping("/user")
public List<UserResponse> getUsers() { // 반환값 : List<UserResponse> -> 사용자 응답을 담고 있는 UserResponse 객체를 리스트로 반환
String sql = "SELECT * FROM user";
return jdbcTemplate.query(sql, new RowMapper<UserResponse>() {
@Override //익명클래스
public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException {
long id = rs.getLong("id");
String name = rs.getString("name");
int age = rs.getInt("age");
return new UserResponse(id, name, age);
}
});
}
lamda사용한 버전
@GetMapping("/user")
public List<UserResponse> getUsers() { // 반환값 : List<UserResponse> -> 사용자 응답을 담고 있는 UserResponse 객체를 리스트로 반환
String sql = "SELECT * FROM user"; //유저테이블의 모든 정보를 가져오는 sql
//RowMapper + alt+ Enter = lamda 로 변형
return jdbcTemplate.query(sql, (rs, rowNum) -> {
long id = rs.getLong("id");
String name = rs.getString("name");
int age = rs.getInt("age");
return new UserResponse(id, name, age);
});
}
2. UserResponse
package com.group.libraryapp.dto.user.response;
import com.group.libraryapp.domain.user.User;
public class UserResponse {
private long id;
private String name;
private Integer age;
public UserResponse(long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public UserResponse(long id, User user) { // name과 age를 domain/User객체로 대신함
this.id = id;
this.name = user.getName();
this.age = user.getAge();
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
3. User
package com.group.libraryapp.domain.user;
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
//이름값이 null이거나 비어있을 때는 예외를 던져서 user자체가 생성이 안되고, 저장도 안됨.
if (name == null || name.isBlank()){
throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다", name));
}
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
// %s: 문자열 포맷팅에서 사용되는 형식지정자 - > 잘못된 name(John)이 들어왔습니다
// (%d는 정수, %f는 부동소수점 숫자를 대체)
4. database console
create database library;
show databases;
drop database library;
use library;
create table user (
id bigint auto_increment,
name varchar(25),
age int,
primary key(id)
);
'프로젝트 > 도서관리 프로젝트' 카테고리의 다른 글
도서관리 프로젝트[4] Controller 3단 분리, 스프링컨테이너, 스프링빈, 인스턴스화 (0) | 2023.06.21 |
---|---|
도서관리 프로젝트[3] 회원 수정, 삭제 (update, delete) (0) | 2023.06.15 |
도서관리 프로젝트[1] - 기획과 유저 등록 (0) | 2023.05.28 |
[before project] HTTP와 API (0) | 2023.05.27 |
[before project] DNS 네트워크 통신 (0) | 2023.05.26 |
댓글