
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
GET은 데이터를 잘 조회했으나 POST (HEADERS: Content-Type & application/json, BODY: 아래 캡처 내용) 입력 후 SEND 버튼 클릭 후 결과는 아래 캡처 화면에서 보듯이 '500 Internal Server Error'가 나타나고 있습니다.
참고로 저는 '[왕초보] 비개발자를 위한, 웹개발 종합반 (프로그래밍 실무, 풀스택) 40회차' 과정에서 PyCharm 등록하기 위해 사용한 동일한 할인코드(1주차에서 알려준 등록 가이드 내 할인코드)가 먹히지 않아서(Only 1회만 사용 가능하다고 JetBrains 사이트에서 팝업으로 통보) Visual Studio Code (VSC) 다운로드 후 여러 설정 (Gradle / jar / java version 8 / lombok 등 5개 확장) 등을 적용하여 과정을 학습하는 중이며 1주차부터 2주차 2-9강까지는 VSC로 정상적인 코딩 및 결과 확인하면서 따라왔습니다.

작성한 코드 및 에러 메세지
오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.
Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.
Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!
Week02Application.java
package com.sparta.week02;
import java.util.List;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import com.sparta.week02.domain.Course;
import com.sparta.week02.domain.CourseRepository;
import com.sparta.week02.domain.CourseRequestDto;
import com.sparta.week02.service.CourseService;
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
// Week02Application.java 의 main 함수 아래에 붙여주세요.
@Bean
public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
return (args) -> {
courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
System.out.println("데이터 인쇄");
List<Course> courseList = courseRepository.findAll();
for (int i = 0; i < courseList.size(); i++) {
Course course = courseList.get(i);
System.out.println(course.getId());
System.out.println(course.getTitle());
System.out.println(course.getTutor());
}
// CourseRequestDto.java 생성으로 주석 처리!
// Course new_course = new Course("웹개발의 봄, Spring", "임민영");
CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
// CourseRequestDto.java 생성으로 주석 처리!
// courseService.update(1L, new_course);
courseService.update(1L, requestDto);
courseList = courseRepository.findAll();
for (int i = 0; i < courseList.size(); i++) {
Course course = courseList.get(i);
System.out.println(course.getId());
System.out.println(course.getTitle());
System.out.println(course.getTutor());
}
// delete 필요 시 아래 주석 풀고 실행!
// courseRepository.deleteAll();
// Practice 2 ========================================================
// 데이터 저장하기
// repository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
// 데이터 전부 조회하기
// List<Course> courseList = repository.findAll();
// for (int i = 0; i < courseList.size(); i++) {
// Course course = courseList.get(i);
// System.out.println(course.getId());
// System.out.println(course.getTitle());
// System.out.println(course.getTutor());
// }
// 데이터 하나 조회하기
// Course course = repository.findById(1L).orElseThrow(
// () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
// );
// ======================================================== Practice 2
// Practice 1 --------------------------------------------------------
// SpartaCodingClub 'IntelliJ IDEA'에서만 가능
// Course course1 = new Course(title: "웹개발의 봄", tutor: "남병관");
// 'Visual Studio Code'에서 돌아가도록 수정!!! begins
// Course course1 = new Course();
// course1.setTitle("웹개발의 봄");
// course1.setTutor("남병관");
// 'Visual Studio Code'에서 돌아가도록 수정!!! ends
// repository.save(course1);
// List<Course> courseList = repository.findAll();
// for (int i = 0; i < courseList.size(); i++) {
// System.out.println(courseList.get(i));
// }
// -------------------------------------------------------- Practice 1
};
}
}
Course.java
package com.sparta.week02.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다. Visual Studio Code에서는 안 먹히는 듯...
@Entity // 테이블임을 나타냅니다.
public class Course extends Timestamped {
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title;
@Column(nullable = false)
private String tutor;
public Course(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
// lombok extension 설치 후 @Getter 선언을 위해 주석 처리
// public Long getId() {
// return this.id;
// }
// public String getTitle() {
// return this.title;
// }
// public String getTutor() {
// return this.tutor;
// }
// 'Visual Studio Code'에서 돌아가도록 추가!!! begins
// Setter
public void setTitle(String title) {
this.title = title;
}
public void setTutor(String tutor) {
this.tutor = tutor;
}
// 'Visual Studio Code'에서 돌아가도록 추가!!! ends
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
// CourseRequestDto.java 생성으로 주석 처리!
// public void update(Course course) {
// this.title = course.title;
// this.tutor = course.tutor;
public void update(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
}
CourseRepository.java
package com.sparta.week02.domain;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CourseRepository extends JpaRepository<Course, Long> {
}
CourseRequestDto.java
package com.sparta.week02.domain;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@RequiredArgsConstructor
public class CourseRequestDto {
private final String title;
private final String tutor;
}
Timestamped.java
package com.sparta.week02.domain;
import java.time.LocalDateTime;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public abstract class Timestamped { // abstract 의미 : 'new' 절대 사용 불가! Only 상속으로만 사용 가능!
@CreatedDate // 생성일자임을 나타냅니다.
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 수정일자임을 나타냅니다.
private LocalDateTime modifiedAt;
}
CourseService.java
package com.sparta.week02.service;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.sparta.week02.domain.Course;
import com.sparta.week02.domain.CourseRepository;
import com.sparta.week02.domain.CourseRequestDto;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {
// final: 서비스에게 꼭 필요한 녀석임을 명시
private final CourseRepository courseRepository;
// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
// 스프링에게 알려줌
// @RequiredArgsConstructor 선언으로 아래 주석 3행 불필요!
// public CourseService(CourseRepository courseRepository) {
// this.courseRepository = courseRepository;
// }
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
// CourseRequestDto.java 생성으로 주석 처리!
// public Long update(Long id, Course course) {
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
// CourseRequestDto.java 생성으로 주석 처리!
// course1.update(course);
course1.update(requestDto);
return course1.getId();
}
}
application.properties
spring.h2.console.enabled = true
# spring.datasource.url = jdbc:h2:mem:testdb
spring.jpa.show-sql = true
spring.datasource.url = jdbc:h2:mem:testdb;MODE=MYSQL
