package com.example.sparta.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
// 단일 조회
@GetMapping("/user/{userId}")
public ResponseEntity<UserResponseDto> getUserInfo(@PathVariable Long userId) {
UserResponseDto user = userService.getUserById(userId);
if (user != null) {
return ResponseEntity.ok(user);
} else {
return ResponseEntity.notFound().build(); // 404 응답을 반환
}
}
// 전체 조회
@GetMapping("/user")
public ResponseEntity<List<UserResponseDto> getUserList() {
List<UserResponseDto> users = userService.getAllUsers();
if (users != null && !users.isEmpty()) {
return ResponseEntity.ok(users);
} else {
return ResponseEntity.noContent().build(); // 204 응답을 반환
}
}
}
package com.example.sparta.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.example.sparta.repository.UserRepository;
import com.example.sparta.dto.UserResponseDto;
import com.example.sparta.entity.User; // 확인할때는 userentity 있다고가정
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public UserResponseDto findUser(Long userId) {
// UserRepository -> userId로 검색
Optional<User> userOptional = userRepository.findById(userId);
if (userOptional.isPresent()) {
User user = userOptional.get();
// User 엔티티 -> UserResponseDto로 변환
UserResponseDto userResponseDto = new UserResponseDto();
userResponseDto.setUserId(user.getUserId());
userResponseDto.setName(user.getName());
userResponseDto.setEmail(user.getEmail());
userResponseDto.setPw(user.getPw());
return userResponseDto;
} else {
return null;
}
}
public List<UserResponseDto> findAllUser() {
// UserRepository를 사용하여 모든 사용자 정보를 가져옴
List<User> users = userRepository.findAll();
// User 엔티티 정보를 UserResponseDto로 변환한 리스트를 반환
return users.stream()
.map(user -> {
UserResponseDto userResponseDto = new UserResponseDto();
userResponseDto.setUserId(user.getUserId());
userResponseDto.setName(user.getName());
userResponseDto.setEmail(user.getEmail());
userResponseDto.setPw(user.getPw());
return userResponseDto;
})
.collect(Collectors.toList());
}
}
package com.example.sparta.entity;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class UserResponseDto {
private Long userId;
private String name;
private String email;
private String pw;
public UserResponseDto(Long userId, String name, String email, String pw) {
this.userId = userId;
this.name = name;
this.email = email;
this.pw = pw;
}
}
이번주 테스트를 통해 생각해본 문제
- 서비스 레이어에서 예외처리
- 비즈니스 로직을 처리하는 서비스 레이어에서 예외가 발생하는 경우에는 서비스 레이어에서 처리하는 게 좋음
- ex) 데이터베이스 조회 중에 예외가 발생하거나, 사용자 정보가 없는 경우 등의 예외를 서비스 레이어에서 처리하고 -> 클라이언트에게 적절한 응답 반환
- 이렇게 하면 비즈니스 로직에서 예외 처리가 명확하게 분리, 서비스 레이어에서 재사용 가능
- 컨트롤러 레이어에서 예외 처리
- HTTP 요청 처리와 관련된 예외 처리는 주로 컨트롤러 레이어에서 처리
- ex) 잘못된 요청이나 경로에 대한 예외, 요청 유효성 검사 실패, 권한 문제 등은 컨트롤러 레이어에서 처리 가능
- 컨트롤러 레이어에서 예외를 처리하여 클라이언트에게 적절한 HTTP 응답 상태 코드와 메세지를 반환 가능
- 언제, 어디서, 어떤식으로 예외처리를 해주는게 좋은 것인가? 하는 생각이 들어서 찾아본 결과
- 이번 답안을 작성하면서는 HTTP 상태코드 반환해주는 방식으로 했지만, 예외처리쪽 학습을 좀 더 하면 서비스쪽에서도 예외처리를 하는 연습을 해봐야겠다(아마 3과제...?)
Optional<User> userOptional = userRepository.findById(userId);
List<User> users = userRepository.findAll();
- 왜 Optional? List?
- 'Optional' 은 데이터가 있을 수도 있고, 없을 수도 있는 단일 결과를 처리하는데 주로 사용
- 사용자를 찾지 못한 경우(Optional이 비어있는 경우), 메서드는 사용자를 찾지 못했음을 나타내기 위해 null 반환
- Optional 사용은 null 참조를 방지하는 괜찮은 방법
- 'List'는 여러결과를 반환하는 데 사용(여기서는 사용자 목록)
- 'Optional' 은 데이터가 있을 수도 있고, 없을 수도 있는 단일 결과를 처리하는데 주로 사용
'기록하기' 카테고리의 다른 글
Lombok 라이브러리 중에서 (0) | 2023.11.02 |
---|---|
@Enumeratecd (0) | 2023.11.02 |
Day + 17 (0) | 2023.11.01 |
Day + 16 (0) | 2023.10.31 |
Day + 15 (0) | 2023.10.30 |