본문 바로가기
아카이브/스프링

스파르타 코딩클럽 [ 웹개발의 봄, Spring ] - 2주차

by nineteen 2022. 1. 2.
반응형

배운 것

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% 알고 넘어가려고 하면 스프링은 그 양이 너무나 방대해서 법전 같은 책 두 권은 족히 떼야 할 거에요.

그렇게 개발을 익히면 너무 오래 걸립니다. 지쳐요. 만드는 재미를 잊어버립니다.

자전거 무게 중심 이론을 몰라도 자전거는 탈 수 있잖아요?

유체역학 몰라도 출퇴근길 자전거 타는데는 무리 없거든요.

우선 네 발 자전거에서 두 발 자전거로 넘어가고, 정말 나중에 프로 사이클 선수가 되었을 때 공기역학과 무게중심에 대해 알아보자구요 😎

 

 

 

느낀 점 / 보완할 점

흥미로우면서도 어렵다.

자주 쳐보고 개념도 익히면서 익숙해지도록 하자..!