커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
스스로 해결
2주차 2-10강 내용 중 POST 방식으로 보낸 뒤 응답 결과
undefined주차
북마크
박*국
댓글
3
추천
0
조회수
31
조회수
31
스스로 해결

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.


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
취소
 공유
취소
댓글 0
댓글 알림
나의얼굴