강사님이 만들어주신 틀에서 주석에 적힌 내용에 따라 실습해본다.
@Transactional
public ResponseEntity<?> insertTodoTableData(ReqTodoTableInsertDTO dto, LoginUserDTO loginUserDTO) {
// 할 일을 입력했는지 확인
// 리파지토리에서 유저 기본키로 삭제되지 않은 유저 찾기
// 할 일 엔티티 생성
// 할 일 엔티티 저장
// 응답 데이터로 리턴하기 (할 일 추가에 성공하였습니다.)
}
TodoService에서 만들어준다.
@Valid를 해줘야 한다.
강사님이 만들어 놓으신 ReqTodoTableInsertDTO.java파일에 들어가서 @Valid랑 @NotNull을 해줘야 한다.
@Valid는 제약조건을 달아놓은 속성에 대해 유효성 검사를 하는 어노테이션이다.
Controller 클래스 내의 메소드에서 DTO를 인자로 받을 때 아래와 같이 적용한다.
유효성 검사가 되지 않을 때, 사용한다.
// 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; }
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에서 로그인 유저 정보가 저장될 걸 가져와서 만들어준다.
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에 들어가보면 들어간 것을 볼 수 잇다.