seong

DB연결해서 UPDATE, INSERT,DELETE,SELECT 해보기(Users-CRUD) 본문

Spring/SpringBoot

DB연결해서 UPDATE, INSERT,DELETE,SELECT 해보기(Users-CRUD)

hyeonseong 2022. 9. 1. 16:27

기본 셋팅

DB에 간단한 예제 테이블 추가 

Controller 

package site.metacoding.red.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import site.metacoding.red.domain.users.Users;
import site.metacoding.red.domain.users.UsersDao;
import site.metacoding.red.web.dto.response.RespDto;

@RequiredArgsConstructor
@RestController
public class UsersController {

   private final UsersDao usersDao;
   
   @GetMapping("/users/{id}")
   public RespDto<?> getUsers(@PathVariable Integer id) {
      
      return new RespDto<>(1,"성공",usersDao.findById(id));
   }
   
}

final일때 @RequiredArgsConstructor

IOC 컨테이너에있는 모든 것들은 생성자 주입으로 받을 수 있다.

final로 붙인 객체는 만들어질 때 값이 들어가야한다. 

방법 1.  @RequiredArgsContructor로 받기

방법2. 직접 생성자를 만들어서 주입 해주는 방법

통신 코드 Dto 직접 작성

통신 하는 코드는 ResponseEntity도 있다. 

이는 모두 데이터를 전달하고 받고, 통신이 잘 이루어졌다는 의미에서 사용 하며, 다음 작업을 하기 위해 협업에서도 필요한 코드이다. 

현재는 직접 Dto를 작성해 1이면 통신 성공, -1이면 실패로 작성. body에는 데이터가 담겨진다. 


SELECT - findById( 특정 id만 보기)

mapper

   <select id="findById" resultType="site.metacoding.red.domain.users.Users">
      SELECT * FROM users WHERE id = #{id}
   </select>

id에 맞게 제대로 값이 찾아진다. 

SELECT - findAll(모두보기)

모두 보기는 List로 리턴

mapper 

모두 보기는 요청을 하고 전달 받은 후 다시 주어야 하기 때문에 return 받아야 한다. -> resultType 작성

   <select id="findAll" resultType="site.metacoding.red.domain.users.Users">
      SELECT * FROM users ORDER BY id DESC
   </select>

Controller

결과 확인 

처음 DB에 있던 값이 제대로 보인다.

INSERT

mapper

   <insert id="insert">
      INSERT INTO users(id, username, password, email, createdAt) 
      VALUES(users_seq.nextval, #{username}, #{password}, #{email}, sysdate)
   </insert>

Dao - INSERT는 데이터를 전달만 하면 되기 때문에 리턴 값 void 

JoinDto 작성만든 이유 id(시퀀스 번호) 와 createData는 자동 생성이다. 그러므로 인위적으로 넣으면 안된다.
그래서 추가할 데이터들인 username,password,email를 넣어 JoinDto를 넣어준다.

Controller 

Insert는 데이터를 전달하고 응답에는 잘되었다는 값만 수신 하면 되기 때문에

응답코드의 body는 null이다. 

RespDto란? -> 통신을 위한 Dto(상태 코드 반환해준다) , 아래 따로 설명.

INSERT 확인 

Delete

Mapper 

   <delete id="delete">
      DELETE FROM users WHERE id= #{id}
   </delete>

Delete도 삭제만 하고, 리턴 받을 데이터가 없기 때문에 void로 작성

Controller -  WHERE절에 들어가는 부분은 모두 주소 header로 전달 한다. (@PathVariable)

결과 확인

id가 21인 행이 삭제 되었다.

Update

  • 업데이트는 업데이트 하는 값중 하나라도 null이 있다면 에러가 난다.
  • 그리고 xml에 속성을 추가해주지 않으면, 바인딩은 두개 이상 할 수 없다. 
  • 업데이트를 하는 방식은 여러가지가 있다. 
  • 지금은 데이터를 덮어씌우는 리팩토링 방식을 사용할 것이다.

리팩토링 순서 

1. 특정 id를 get으로 불러와 변수에 담아둔다.(영속화)

2. Update할 부분을 해준다. ex)패스워드수정

3. 바꾼 상태로 원래 있던 데이터를 덮어씌운다 

Mapper 

	<update id="update">
		UPDATE users 
		SET username = #{username},
		 password = #{password} ,
		 email = #{email}
		WHERE id = #{id}
	</update>

UsersDao

결국 리팩토링하면 전체를 덮어쓰는 것 이기 때문에 Users 오브젝트를 넣는다.

업데이트의 필요한 부분만 수정할 수 있는 메서드, 덮어씌워주는 역할을 해주는 전체 수정 메서드 Users에 작성

UpdateDto 

joinDto와 같은 이유로 만들었다.

Controller 

결과 

1. 전체 수정

2. 비밀번호만 수정