본문 바로가기
프로젝트/도서관리 프로젝트

도서관리 프로젝트[2] - 유저 조회

by CodeMango 2023. 5. 28.

유저조회 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)
);

댓글