seong
DB연결해서 UPDATE, INSERT,DELETE,SELECT 해보기(Users-CRUD) 본문
기본 셋팅
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)
결과 확인
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. 비밀번호만 수정
'Spring > SpringBoot' 카테고리의 다른 글
게시판 만들기 Delete 기능 Form태그로 만들어보기 (0) | 2022.09.07 |
---|---|
게시판 만들어보기 (로그인 이후) (0) | 2022.09.05 |
Spring에서 Oracle연결 및 초기 셋팅, 테이블 만들기 테스트 (0) | 2022.08.31 |
Spring 에서 Oracle 테이블 만들어보기(Yellow프로젝트) (0) | 2022.08.31 |
Yellow 프로젝트 H2 데이터 연결 , Oracle 연결 (의존성 활용,JPA) (0) | 2022.08.31 |