IntelliJ IDEA
new project - spring initializr
group : com.sparta
arifact : week01
type : Gradle
language : Java
Java vesion : 8
lombok, H2 database, spring web, spring data JPA, Mysql Driver
Finish
HTML을 받는 경우 - 요청을 보내고, 받은 html파일을 그려줌
데이터만 받는 경우
src
main
ㄴ resources
ㄴstatic
ㄴ templates
ㄴ application.properties
ㄴ java
ㄴ com.sparta.week02
ㄴ controller
ㄴCourseController
ㄴ domain
ㄴ Course
ㄴ CourseRepository (i)
ㄴ CourseRequestDto
ㄴ Timestamped
ㄴ sevice
ㄴCourseService
ㄴ Week02Application
자바 언어 바탕의 서버 담당
요청에 따라 눈에 보이는 것들 또는 데이터를 제공해 주는 것
1. Controller : 가장 바깥, 요청/응답 처리
2. Service : 중간, 실제 중요한 작동이 많이 일어나는 부분
3. Repo : 가장 안쪽, DB와 맞닿아 있음.(repo, entity)
Rest
Controller
// src > main > com.sparta.week01에 controller 패키지 만듦
// CourseController.java 파일 만듦
# CourseController.java
@RestController
public class CourseController {
@GetMapping("/courses") // 스프링 주소 뒤가 /courses 일 경우
public Course getCourses() { // getCourse 메소드를 실행
Course course = new Course();
course.setTitle("웹개발의 봄 스프링");
course.setDays(35);
course.setTutor("남병관");
return course;
}
}
라이브러리를 가져올 수 있게 도와줌
빌드해서 실제 배포 가능하하게 해줌
Maven Repository
* 다른 사람들이 만들어둔 도구 내려받기
1. Maven Repository에서 원하는 라이브러리 찾음
2. build.gradle에 원하는 프로젝트 파일 넣음
3. RUN
4. 우측 gradle 탭의 새로고침 버튼을 누름
5. 대상 프로젝트가 추가된 것을 확인
(Relational DataBase Management System)
- 컴퓨터에 정보를 저장하고 관리하는 기술
- 행과 열로 된 2차원이나 3차원의 표로 데이터를 표현하는 데이터베이스 관리 시스템
- 갑자기 중간에 열 하나를 추가하기는 어렵지만, 정형화되어 있는만큼데이터의 일관성이나
분석에 용이
ex) MS-SQL
서비스를 배포할 때 사용
in-memory-DB : 서버가 작동하는 동안에만 내용을 저장, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스
H2 웹콘솔 띄우기
src > main > resources > application.properties
# 붙여넣기
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
# week02Application.java 파일 run
# localhost:8080/h2-console 로 접속 - connect
SQL(Structed Query Language)
# 데이터 생성
CREATE TABLE IF NOT EXISTS courses ( // courses 테이블 생성
id bigint(5) NOT NULL AUTO_INCREMENT,
title varchar(255) NOT NULL,
tutor varchar(255) NOT NULL,
PRIMARY KEY (id)
);
# 데이터 삽입
INSERT INTO courses (title, tutor) VALUES
('웹개발의 봄, Spring', '남병관'), ('웹개발 종합반', '이범규');
# 데이터 조회
SELECT * FROM courses;
Spring | MySQL |
---|---|
Domain | Table |
Repository | SQL |
# Domain, repository 도입
1. src > main > java > com.sparta.week02 에 domain 이라는 패키지 만듦
2. Course.java, CourseRepository.java 파일 생성
# Course.java
@NoArgsConstructor // 기본생성자를 대신 생성
@Entity // 테이블임을 나타냅니다.
public class Course {
@Id // ID 값, Primary Key로 사용하겠다는 뜻
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냄
private String title;
@Column(nullable = false)
private String tutor;
public String getTitle() { // getter 생성
return this.title;
}
public String getTutor() {
return this.tutor;
}
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
# CourseRepository.java 인터페이스
public interface CourseRepository extends JpaRepository<Course, Long> {
}
# sql이 보이도록 application.properties 세팅
spring.jpa.show-sql=true
# JPA 실행 코드
// Week02Application.java 의 main 함수 아래에
@Bean // 지금은 몰라도 됨
public CommandLineRunner demo(CourseRepository repository) {
return (args) -> {
Course course1 = new Course("웹개발의 봄 Spring", "남병관");
repository.save(course1);
List<Course> courseList = repository.findAll();
for (int i=0; i<courseList.size(); i++) {
Course c= courseList.get(i);
System.out.println(c.getTitle());
}
};
}
Course 클래스에 생성일자, 수정일자 추가하기
# Timestamped.java 만들기
@MappedSuperclass // 상속했을 때, 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영
public class Timestamped {
@CreatedDate // 생성일자
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 수정일자
private LocalDateTime modifiedAt;
}
# Course 클래스에 extends Timestamped 추가
# Week02Application 클래스에
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application { // 추가
# localhost:8080/h2-console 에서 확인
LOMBOK : 코드 요약
DTO : 정보를 업데이트할 떄 기존 class 말고 새로 생성한 class를 사용하자
read, update 할 때 기존 class 말고 새로 생성하여 class를 사용하게 하는 것 (다른 사람이 본 class를 변경하지 못하게)
1. src > main > java > com.sparta.week02 > Domain에
CourseRequestDto 파일 생성
# CourseRequestDto.java
@NoArgsContructor // 기본생성자 생성
@Getter
public class CourseRequestDto {
private String title;
private String tutor;
public CourseRequestDto(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
2. 적용하기
# CourseService 변경
@RequiredArgsConstructor
@Service
public class CourseService {
private final CourseRepository courseRepository;
@Transactional
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(requestDto);
return course1.getId();
}
}
# Course.java 변경
@Getter
@NoArgsConstructor
@Entity
public class Course extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String tutor;
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
public void update(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
}
# Week02Application 변경
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
@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 requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
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());
}
courseRepository.deleteAll();
};
}
}
"GET/courses" 방식으로 의도를 명확히 드러냄을 의미
1. src > main > java > com.sparta.week02에 controller 패키지 만듦
2. CourseController.java 파일 생성
@RequiredArgsConstructor
@RestController
public class CourseController {
private final CourseRepository courseRepository;
@GetMapping("/api/courses")
public List<Course> getCourses() {
return courseRepository.findAll();
}
}
3. Week02Application.java
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {
public static void main(String[] args) {
SpringApplication.run(Week02Application.class, args);
}
@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 requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
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());
}
};
}
}
4. localhost:8080/api/courses 접속
(ARC - Advanced REST Client)
1. CourseController.java
private final CourseService courseService;
// PostMapping을 통해서, 같은 주소라도 방식이 다름을 구분합니다.
@PostMapping("/api/courses")
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
// requestDto 는, 생성 요청을 의미합니다.
// 강의 정보를 만들기 위해서는 강의 제목과 튜터 이름이 필요하잖아요?
// 그 정보를 가져오는 녀석입니다.
// 저장하는 것은 Dto가 아니라 Course이니, Dto의 정보를 course에 담아야 합니다.
// 잠시 뒤 새로운 생성자를 만듭니다.
Course course = new Course(requestDto);
// JPA를 이용하여 DB에 저장하고, 그 결과를 반환합니다.
return courseRepository.save(course);
}
2. Course 클래스 생성자 추가
public Course(CourseRequestDto requestDto) {
this.title = requestDto.getTitle();
this.tutor = requestDto.getTutor();
}
3. ARC 확인
Headers - Content-Type, application/json
Body - post 내용 입력
# CourseController.java에 추가
@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
return courseService.update(id, requestDto);
}
# CourseController.java에 추가
@DeleteMapping("/api/courses/{id}")
public Long deleteCourse(@PathVariable Long id) {
courseRepository.deleteById(id);
return id;
}