인프런 커뮤니티 질문&답변

우잉님의 프로필 이미지

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

도애체 어디에서 오류가 난건지 모르겠습니다.

작성

·

198

·

수정됨

0

다음과 같이 코드를 했는데 24강까지 애플리케이션에서 잘 삭제되고, 잘 저장되었는데 25강이후 코드는 실행되는데 '나이'가 입력을 해도 00세로 나오고, 목록에서 삭제하려고하면 '서버내부 오류입니다'라고 뜹니다.

아래 질문에서 쉬운거는 편집된게 있다고 하는데

배우는단계에 있는 사람으로써는 그렇게 편집되면 많이 당황스럽네요...ㅜㅜㅜㅜㅜ

어디서 틀렸나요?ㅜㅜ

UserResponse

package com.group.libraryapp.dto.user.response;

import com.group.libraryapp.domain.user.User;

public class UserResponse {
    private long id;
    private String name;
    private Integer age;

    public UserResponse(long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public UserResponse(User user) {
        this.id = user.getId();
        this.name = user.getName();
    }

    public UserResponse(long id, User user) {
        this.id = id;
        this.name = user.getName();
        this.age = user.getAge();
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

User

package com.group.libraryapp.domain.user;

import javax.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;

    @Column(nullable = false, length = 20, name = "name")
    private String name;
    private Integer age;

    protected User() { }

    public User(String name, Integer age) {
        if (name == null || name.isBlank()) {
            throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.",name));
        }

        this.name = name;
        this.age = age;

    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
    //User class
    public Long getId() {
        return id;
    }

    public void updateName(String name) {
        this.name = name;
    }
}

UserRepository

package com.group.libraryapp.domain.user;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByName(String name);
}

UserController

package com.group.libraryapp.controller.user;

import com.group.libraryapp.dto.user.request.UserCreateRequest;
import com.group.libraryapp.dto.user.request.UserUpdateRequest;
import com.group.libraryapp.dto.user.response.UserResponse;
import com.group.libraryapp.service.user.UserServiceV2;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController

public class UserController {

    private final UserServiceV2 userServiceV2;

    public UserController(UserServiceV2 UserServiceV2) {

        this.userServiceV2 = UserServiceV2;

    }

    @PostMapping("/user")
    public void saveUser(@RequestBody UserCreateRequest request) {
        userServiceV2.saveUser(request);
    }

    @GetMapping("/user")
    public List<UserResponse> getUsers() {
        return userServiceV2.getUsers();
    }

    @PutMapping("/user")
    public void updateUser (@RequestBody UserUpdateRequest request) {
       userServiceV2.updateUser(request);
    }

    @DeleteMapping("/user")
    public void deldteUser (@RequestParam String name) {
       userServiceV2.deleteUser(name);
    }
}

UserServiceV2

package com.group.libraryapp.service.user;

import com.group.libraryapp.domain.user.User;
import com.group.libraryapp.domain.user.UserRepository;
import com.group.libraryapp.dto.user.request.UserCreateRequest;
import com.group.libraryapp.dto.user.request.UserUpdateRequest;
import com.group.libraryapp.dto.user.response.UserResponse;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserServiceV2 {

    private final UserRepository userRepository;

    public UserServiceV2(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(UserCreateRequest request) {
        User u = userRepository.save(new User(request.getName(), request.getAge()));
        //System.out.println(u.getId());
    }

    public List<UserResponse> getUsers() {
        return userRepository.findAll().stream()
                .map(UserResponse::new)
                .collect(Collectors.toList());
    }

    public void updateUser(UserUpdateRequest request) {
        User user = userRepository.findById(request.getId())
                .orElseThrow(IllegalArgumentException::new);
        user.updateName((request.getName()));
        userRepository.save(user);
    }

    public void deleteUser(String name) {
        User user = userRepository.findByName(name);
        if (user == null) {
            throw new IllegalArgumentException();
        }
        userRepository.delete(user);
    }
}

 UserCreateRequest

package com.group.libraryapp.dto.user.request;

public class UserCreateRequest {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

 

답변 2

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 우잉님! 하나씩 천천히 답변 드려 보겠습니다! 🙂

다음과 같이 코드를 했는데 24강까지 애플리케이션에서 잘 삭제되고, 잘 저장되었는데 25강이후 코드는 실행되는데 '나이'가 입력을 해도 00세로 나오고, 목록에서 삭제하려고하면 '서버내부 오류입니다'라고 뜹니다.

"서버내부 오류입니다" 라고 나온다는건 말 그대로 서버측에서 무언가 문제가 생겼다는 뜻인데요!

우선 보내주신 코드를 살펴보았을 때 잘못된 부분은 없어 보입니다.

서버측에서 에러가 발생하면 관련된 로그가 IntelliJ에 남기 때문에 해당 로그를 첨부해주시면 원인 파악에 조금 더 도움이 될 것 같습니다 🙂 또한 로그를 읽고 직접 해결해보시거나 구글 검색, Chat GPT 검색을 해보시는 것도 좋습니다! 👍

 

아래 질문에서 쉬운거는 편집된게 있다고 하는데

배우는단계에 있는 사람으로써는 그렇게 편집되면 많이 당황스럽네요...ㅜㅜㅜㅜㅜ

이렇게 말씀해주신 것도 너무너무 공감됩니다! 😭 새로운 개념은 쉽게 설명드리고 반복되고 쉬운 내용은 편집으로 지루함을 매꿔보려고 해도 강의를 들으시는 분마다 갖고 계신 배경지식이 다르기에 참 어려운 부분인 것 같네요!

이렇게 댓글로 라도 전에 질문 주셨던 부분에서 이어서 설명드려보면

자바 클래스에는 "생성자"라는 것이 있습니다.

우리가 만든 class 코드를 new 연산자를 사용해 인스턴스화 하기 위해서는 "생성자"를 호출해야 하는데요.

이때 "생성자"에 필요한 파라미터를 넣어 우리가 원하는 초기값을 설정할 수 있습니다.

예를 들어

public class Person {
  private String name;

  public Person(?) {
    ?
  }
}

위와 같은 코드를 본다면, Person 이라는 클래스에 name 이라는 필드가 있으니 name 에 대한 초기값을 설정해주기 위해 name 을 매개변수로 받는 생성자를 만들 수 있고, 자연스럽게

public Person(String name) {
  this.name = name;
}

이라는 코드를 생각할 수 있습니다.

 

비슷하게 자바 class에는 getter 라는 개념이 있습니다. 대부분 필드가 private 으로 만들어졌기 때문에 클래스 외부에서 private 필드에 접근할 수는 없고, public getXXX() 를 이용해 접근하게 됩니다.

예를 들어 위의 Person 클래스를 예시로 보면 name 이라는 필드가 private 으로 선언되어 있으니 자연스럽게

public String getName() {
  return this.name;
}

이라고 쓸 수 있죠.

 

코드상 문제는 없어 보여서 에러 내용을 첨부 한 번 부탁드리고요

또 어려운 부분 있으시면 편하게 질문 남겨주세요. 감사합니다! 🙏

0

최태현님의 프로필 이미지
최태현
지식공유자

추가로 강의에서는 완성된 코드 버전을 제공하고 있습니다! 👍

해당 코드와 비교해보시는 것도 공부가 많이 되실 것 같아요. 감사합니다! 🙏

우잉님의 프로필 이미지

작성한 질문수

질문하기