(복습)todo 실습

서지우·2023년 8월 2일
0

Spring Boot

목록 보기
14/18

todo에서 할 일을 추가하기

강사님이 만들어주신 틀에서 주석에 적힌 내용에 따라 실습해본다.

    @Transactional
    public ResponseEntity<?> insertTodoTableData(ReqTodoTableInsertDTO dto, LoginUserDTO loginUserDTO) {
        // 할 일을 입력했는지 확인

        // 리파지토리에서 유저 기본키로 삭제되지 않은 유저 찾기
        
        //  할 일 엔티티 생성

        //  할 일 엔티티 저장

        //  응답 데이터로 리턴하기 (할 일 추가에 성공하였습니다.)

    }

TodoService에서 만들어준다.

할 일을 입력했는지 확인

@Valid를 해줘야 한다.

ReqTodoTableInsertDTO.java

강사님이 만들어 놓으신 ReqTodoTableInsertDTO.java파일에 들어가서 @Valid랑 @NotNull을 해줘야 한다.


@Valid 어노테이션이란?

@Valid는 제약조건을 달아놓은 속성에 대해 유효성 검사를 하는 어노테이션이다.
Controller 클래스 내의 메소드에서 DTO를 인자로 받을 때 아래와 같이 적용한다.

@NotNull

유효성 검사가 되지 않을 때, 사용한다.

// getter, setter 생략
class UserDto {
    Long id;
    String name;
    @NotNull
    int age;
}

적용이 안되는 이유는, primitive type인 int는 자동으로 0으로 초기화 되므로, @NotNull에 걸리지 않게 되기 때문이다. 이럴 때는, 아래와 같이 적용하면 된다.

// getter, setter 생략
class UserDto {
    Long id;
    String name;
    @NotNull
    Integer age;
}

참고자료
https://velog.io/@jduckling_1024/Valid


package com.example.my.domain.todo.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public class ReqTodoTableInsertDTO {

	// 적어줌
    @Valid
    @NotNull(message = "할 일을 입력해주세요")
    private Todo todo;

    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Getter
    public static class Todo {
		
        // 적어줌
        @NotNull(message = "내용을 입력해주세요")
        private String content;
    }
}

리파지토리에서 유저 기본키로 삭제되지 않은 유저 찾기

todoRepository.java에서 작성해놓은 JPA쿼리를 맞게 가져온다.

userRepository.findByIdxAndDeleteDateIsNull(loginUserDTO.getUser().getIdx());

여기서 ctrl + alt + v를 해서 뽑아내서

        Optional<UserEntity> userEntityOptional = userRepository.findByIdxAndDeleteDateIsNull(loginUserDTO.getUser().getIdx());

userEntityOptional로 이름을 만들어준다.
todoRepository에서 보면 Optional로 되어있어서 isEmpty() 또는 isPresent()로 처리를 해줘야 한다.

        // 리파지토리에서 유저 기본키로 삭제되지 않은 유저 찾기
        Optional<UserEntity> userEntityOptional = userRepository.findByIdxAndDeleteDateIsNull(loginUserDTO.getUser().getIdx());
        if (userEntityOptional.isEmpty()) {
            throw new BadRequestException("없어요~~~~");
        }
        UserEntity userEntity = userEntityOptional.get();

할 일 엔티티 생성

builder를 사용해서 생성해준다.
content는 매개변수를 ReqTodoTableInsertDTO dto에서 가져오기 때문에 dto.해서 가져옴
doneYn은 테이블의 컬럼 타입을 보면 "N"은 아직 하지 않은 것, "Y"는 완료한 것이라 insert를 해야하므로 "N"으로 함
CreateDate는 엔티티 작성할 때 LocalDateTime으로 했기 때문에
userEntity는 위에 Optional을 처리해주고 뽑아준 친구를 넣음

TodoEntity.builder()
        .content(dto.getTodo().getContent())
        .doneYn('N')
        .createDate(LocalDateTime.now())
        .userEntity(userEntity)
        .build();

그러고 난 후 ctrl + alt + v를 해서 뽑아내서

        //  할 일 엔티티 생성
        TodoEntity todoEntity = TodoEntity.builder()
        .content(dto.getTodo().getContent())
        .doneYn('N')
        .createDate(LocalDateTime.now())
        .userEntity(userEntity)
        .build();

할 일 엔티티 저장

저장한다.

todoRepository.save(todoEntity);

응답 데이터로 리턴하기 (할 일 추가에 성공하였습니다.)

HttpStatus를 해준다.

        return new ResponseEntity<>(
            ResponseDTO.builder()
                .code(0)
                .message("할 일 추가에 성공하였습니다.")
                .build(),
            HttpStatus.OK
        );

TodoControllerApiV1에서 화면에 뿌려줄 코드를 작성한다.
주석을 해결하면 된다.

    @PostMapping
    public ResponseEntity<?> insertTodoTableData(
            @Valid @RequestBody ReqTodoTableInsertDTO dto,
            HttpSession session
    ) {
        // TODO : session에 dto가 없으면 BadRequest 처리

        // TODO : 서비스에서 할 일 추가하기

    }

session에 dto가 없으면 BadRequest 처리

session에서 로그인 유저 정보가 저장될 걸 가져와서 만들어준다.

AuthService에서 세션에 로그인 유저 정보 저장하기 위해 가져올 때 dto를 사용한 것을 볼 수 있다.

        // 세션에 로그인 유저 정보 저장
        session.setAttribute("dto", LoginUserDTO.of(userEntity));

유저 정보가 저장된 값이 null인지 아닌지 판단해준다.

        LoginUserDTO userDTO = (LoginUserDTO) session.getAttribute("dto");
        if (userDTO == null) {
            return new ResponseEntity<>(
            ResponseDTO.builder()
                .code(1)
                .message("실패!!")
                .build(),
            HttpStatus.BAD_REQUEST
            );
        }
        return todoServiceApiV1.insertTodoTableData(dto, userDTO);

서비스에서 할 일 추가하기

실행해서 포스트맨에서 로그인을 해서 성공하면

http://localhost:8080/api/v1/todo입력하고 send를 한다.

그럼 이렇게 성공한 것을 볼 수 있다.

만약에 null을 입력하면

아래와 같이 나오는 것을 볼 수 있다.

h2에 들어가보면 들어간 것을 볼 수 잇다.

profile
미래가 기대되는 풀스택개발자 공부 이야기~~

0개의 댓글