본문 바로가기

기록하기

Day + 18



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'는 여러결과를 반환하는 데 사용(여기서는 사용자 목록) 

 

 

'기록하기' 카테고리의 다른 글

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