[Spring Boot] 게시물 사이트 제작하기2 - (1) User 관련

김광일·2024년 9월 24일
0

SpringBoot

목록 보기
8/19
post-thumbnail

[1] User.java (Domain)

package com.example.demo.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
@Entity
public class User {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id // primary key를 지정
    Integer id;

    // 데이터 정보 선언
    @Column (unique = true, nullable = false)
    String username;

    @Column(nullable = false)
    String password;
    String name;
    String phone;
}

1) GeneratedValue(strategy = GenerationType.IDENTITY)

: 기본키 생성을 데이터베이스에게 위임하는 방식으로 id값을 따로 할당하지 않아도 데이터베이스가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성해준다.

  • 기존에 있던 데이터베이스가 남아 있는 경우, id 값을 못 읽어들이는 에러가 발생할 수 있다. (따라서 사용하려면 기존 DB를 없애거나 다시 시작)
  • 참고하면 좋을 법한 내용

[2] UserRepository.java

package com.example.demo.repository;

import com.example.demo.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    User findByUsername(String username);
}

1) User findByUsername(String username)

  • findByUsername 메서드를 구현하지 않아도 사용할 수 있는 이유는 Spring Data JPA가 제공하는 메서드 쿼리 생성 규칙 덕분
    • Spring Data JPA는 인터페이스에 메서드를 선언할 때, 메서드 이름을 분석하여 그에 맞는 쿼리를 자동으로 생성해준다.
    • findByUsername이라는 메서드는 User 엔티티에서 username 필드를 기준으로 검색하는 쿼리를 자동으로 만들어주기 때문에, 별도로 구현하지 않아도 된다.

[3] UserService.java

package com.example.demo.service;

import com.example.demo.domain.User;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public interface UserService {
    Map<String, Object> create(Map<String, Object> params);
    User update(Map<String, Object> params);

    List<User> list();

    User detail(Integer id);

    User delete(Integer id);
}

1) 특징

  • 사용할 메소드의 Interface를 지정

[4] UserServiceImpl

package com.example.demo.service.impl;

import com.example.demo.domain.User;
import com.example.demo.repository.UserRepository;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

    public UserServiceImpl(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    @Override
    public Map<String, Object> create(Map<String, Object> params) {
        User user = null;

        String username1 = (String) params.get("username");
        user = userRepository.findByUsername(username1);

        Map<String, Object> result = new HashMap<String, Object>();
        if(user == null){
            user = new User();
            user.setUsername(params.get("username").toString());
            user.setPassword(params.get("password").toString());
            user.setName(params.get("name").toString());
            user.setPhone(params.get("phone").toString());
            user = userRepository.save(user);
            result.put("id", user.getId());
        } else {

            result.put("id duplicated", user.getId());
        }

        return result;
    }

    @Override
    public User update(Map<String, Object> params) {
        User user = userRepository.findById(Integer.parseInt(params.get("id") + "")).orElseThrow(
                () -> new RuntimeException("")
        );

        if(params.get("username") != null){
            user.setUsername(params.get("username").toString());
        }
        if (params.get("password") != null){
            user.setPassword(params.get("password").toString());
        }
        if (params.get("password") != null) {
            user.setName(params.get("name").toString());
        }
        if (params.get("phone") != null){
            user.setPhone(params.get("phone").toString());
        }

        userRepository.save(user);
        return null;
    }

    @Override
    public List<User> list() {
        return userRepository.findAll();
    }

    @Override
    public User detail(Integer id) {
        return userRepository.findById(id).orElse(null);
    }

    @Override
    public User delete(Integer id) {
        User user = userRepository.findById(id).orElseThrow(
                () -> new RuntimeException("")
        );
        userRepository.delete(user);
        return null;
    }
}

1) create / update / list / detail / delete 메소드 구현

2) user null check

    @Override
    public Map<String, Object> create(Map<String, Object> params) {
        User user = null;

        String username1 = (String) params.get("username");
        user = userRepository.findByUsername(username1);

        Map<String, Object> result = new HashMap<String, Object>();
        if(user == null){
            user = new User();
            user.setUsername(params.get("username").toString());
            user.setPassword(params.get("password").toString());
            user.setName(params.get("name").toString());
            user.setPhone(params.get("phone").toString());
            user = userRepository.save(user);
            result.put("id", user.getId());
        } else {
            result.put("id duplicated", user.getId());
        }
        return result;
    }
  • 유저 생성(등록) 시 입력한 정보의 username을 참고하여 존재 여부를 판단한다.
    • 존재하지 않으면 생성, 존재하면 "중복"을 전달한다.

[5] UserController.java

package com.example.demo.controller.page;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/user")
@Controller
public class UserController {
    @GetMapping("/{page}")
    public String page(@PathVariable String page){
        return "user/" + page;
    }

    @GetMapping("/{page}/{id}")
    public String page2(@PathVariable String page, @PathVariable String id){
        return "user/" + page;
    }
}

1) /user 이후의 매핑의 경로로 페이지 이동을 담당한다.

[6] UserRestController.java

package com.example.demo.controller;

import com.example.demo.domain.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RequestMapping("/api/user")
@RestController
public class UserRestController {

    private final UserService userService;

    public UserRestController(UserService userService){
        this.userService = userService;
    }

    List<Map<String, Object>> boardList = new ArrayList<>(); // 입력 데이터를 저장하는 List

    @GetMapping({"/create"})
    public Map<String, Object> create(@RequestParam Map<String, Object> params) {
        return userService.create(params);
    }

    @GetMapping({"/list"})
    public List<User> list() {
        return userService.list();
    }
    @GetMapping({"/detail"})
    public User detail(@RequestParam Integer id) {
        return userService.detail(id);
    }

    @GetMapping({"/update"})
    public User update(@RequestParam Map<String, Object> params) {
        return userService.update(params);
    }

    @GetMapping({"/delete"})
    public User delete(@RequestParam Map<String, Object> params) {
        return userService.delete(Integer.parseInt(params.get("id") + ""));
    }
}

1) /api/user 경로로 들어오는 API 요청을 처리한다.

profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글