배운 것
JPA
스프링의 구조 (Controller, Service, Repository)
CRUD
REST API
내용 정리
JPA
- 자바 코드를 SQL로 번역하기 위해 사용
데이터베이스에서 "테이블"은 자바에서 "Domain"으로 표현되고
데이터베이스에서 "SQL"은 자바에서 "Repository"로 표현된다.
테이블을 자바에서 Domain으로 만들기 위해선 어떻게 해야할까?
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String name;
...
}
@Entity라는 애노테이션을 붙여 '테이블'임을 나타낸다
@Id라는 애노테이션을 붙여 기본키를 설정해준다. (필수!)
@Column 애노테이션을 붙여 테이블의 속성이라는 것을 설정해준다.
SQL을 자바에서 Repository로 사용하려면 어떻게 해야할까?
// jpa는 인터페이스를 통해서만 사용할 수 있기 때문에 인터페이스로 정의
// sql역할을 대신 해줌, // 클래스, id
public interface PersonRepository extends JpaRepository<Person, Long> {
}
주석과 같이 JpaRepository를 상속받는데, 이는 JpaRepository가 미리 가지고있는 메소드를 그대로 쓰기 위함이다
사용 예시)
@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) -> {
// INSERT
courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
System.out.println("데이터 인쇄");
// SELECT
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", "임민영");
// UPDATE
courseService.update(1L, requestDto);
// SELECT
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());
}
};
}
}
@EnableJpaAuditing 애너테이션을 붙여야 JPA사용 가능
스프링의 구조
- 3가지 영역으로 나눌 수 있음
1. Controller
- 요청/응답을 처리
2. Service
- 실제 중요한 작동이 많이 일어나는 부분
- 로직
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {
// final: 서비스에게 꼭 필요한 녀석임을 명시
private final CourseRepository courseRepository;
// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
// 스프링에게 알려줌
public CourseService(CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, Course course) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(course);
return course1.getId();
}
}
3. Repository
- DB와 관계
CRUD
- 생성 (Create)
- 조회 (Read)
- 변경 (Update)
- 삭제 (Delete)
데이터를 저장(Create)하고 조회(Read)할 땐, Repository의 save와 findAll등을 이용
// 데이터 저장하기
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("해당 아이디가 존재하지 않습니다.")
);
변경(Update)는 Service에서 미리 작성을 한 후, 호출하는 방식으로 사용
삭제(Delete)는 Repository의 delete등을 이용
@Bean
public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
return (args) -> {
// INSERT
courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));
System.out.println("데이터 인쇄");
// SELECT
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());
}
Course new_course = new Course("웹개발의 봄, Spring", "임민영");
// UPDATE
courseService.update(1L, new_course);
// SELECT
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();
};
}
Lombok
- 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메소드/생성자 등을 자동생성해줌으로써 코드를 절약할 수 있도록 도와주는 라이브러리
DTO
- 데이터를 주고 받을 때 사용하는 클래스
- 테이블을 직접 주고 받는 것은 위험하기 때문에 DTO를 사용해서 데이터를 주고받는다
// Lombok사용 예시
@Setter
@Getter
@RequiredArgsConstructor
// 데이터를 전달하고 주고 받을때 사용하는 클래스, DTO
public class PersonRequestDto {
private final String name;
private final int age;
private final String job;
private final String phoneNumber;
}
REST API
ㅇ REST
- 주소에 명사, 요청 방식에 동사(CRUD)를 사용함으로써 의도를 명확히 드러냄을 의미
ㅇ REST API
- 예시로 A에 대해 생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청을 하는 것
- EX) GET /api/persons → 전체 친구 목록 조회 요청
@GetMapping("/api/persons")
public List<Person> getInfo() {
return personRepository.findAll();
}
- EX) POST /api/persons → 친구 목록 생성 요청
@PostMapping("/api/persons")
public Person makePerson(@RequestBody PersonRequestDto personRequestDto) {
Person person = new Person(personRequestDto);
return personRepository.save(person);
}
- EX) PUT /api/persons/3 → ID가 3번인 친구 수정 요청
@PutMapping("/api/persons/{id}")
public Long modifyPerson(@PathVariable Long id, @RequestBody PersonRequestDto personRequestDto) {
return personService.update(id, personRequestDto);
}
- EX) DELETE /api/persons/2 → ID 2번인 친구 삭제 요청
@DeleteMapping("/api/persons/{id}")
public Long deletePerson(@PathVariable Long id) {
personRepository.deleteById(id);
return id;
}
@Bean, 익명 함수 등은 실무에서 중요한 것들이 맞습니다.
하지만 중요한 건 지금 단계에서 필요한게 아니라는 거에요.
여기서 전부 이해하자고 하면, 그리고 앞으로 모르는게 나올 때마다 100% 알고 넘어가려고 하면 스프링은 그 양이 너무나 방대해서 법전 같은 책 두 권은 족히 떼야 할 거에요.
그렇게 개발을 익히면 너무 오래 걸립니다. 지쳐요. 만드는 재미를 잊어버립니다.
자전거 무게 중심 이론을 몰라도 자전거는 탈 수 있잖아요?
유체역학 몰라도 출퇴근길 자전거 타는데는 무리 없거든요.
우선 네 발 자전거에서 두 발 자전거로 넘어가고, 정말 나중에 프로 사이클 선수가 되었을 때 공기역학과 무게중심에 대해 알아보자구요 😎
느낀 점 / 보완할 점
흥미로우면서도 어렵다.
자주 쳐보고 개념도 익히면서 익숙해지도록 하자..!
'아카이브 > 스프링' 카테고리의 다른 글
스파르타 코딩클럽 [ 웹 개발의 봄, Spring ] - 4주차 (0) | 2022.01.22 |
---|---|
스파르타 코딩클럽 [ 웹 개발의 봄, Spring ] - 3주차 (0) | 2022.01.05 |
스프링의 정석 (세션) (0) | 2021.12.28 |
스프링의 정석 (쿠키) (0) | 2021.12.28 |
스프링의 정석 ( redirect / forward ) (0) | 2021.12.28 |