ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring 개발일지 EP.2
    2022년 스파르타코딩 2022. 7. 18. 16:39
    반응형

    * 목표 * 

    1. RDBMS의 기초 지식을 습득한다.
    2. Spring Data JPA의 사용법을 습득한다.
    3. REST API를 만드는 방법을 익힌다.

     

    - RDBMS는  Relational DataBase Management System

    관계형 디비이다. 우리가 흔히 쓰는 MySQL이 대표적이고, PostgreSQL 등이 있다.

    우린 H2를 사용하면서 '서버가 작동될때만 데이터를 저장하거나 하는 DB'를 알아볼것이다.

    우선 src > main > resources > application.properties 파일에 H2 웹콘솔 설정을 한다. 

    spring.h2.console.enabled=true
    spring.datasource.url=jdbc:h2:mem:testdb

    이후 실행하면

    http://localhost:8080/h2-console 접속 후 connect하면 됨.  쿼리문은 대충 하면된다.(알아서 터득하길 구글링 ㄱㄱ)

    // 테이블 생성
    CREATE TABLE IF NOT EXISTS tutors (
        id bigint(5) NOT NULL AUTO_INCREMENT, //이거 안되면 bigint지우고 int만 해봥
        name varchar(255) NOT NULL,
        age bigint(5) NOT NULL,
        PRIMARY KEY (id)
    );
    
    // 데이터 삽입
    INSERT INTO tutors (name, age) VALUES
        ('손흥민', 30);
    
    // 데이터 조회
    SELECT * FROM tutors;
    
    그래도 보면은 아니까 아무값 넣어줄게

    자 그런데 여기서 우린 쿼리문 다 알 필요가 없다는 사실이다. 왜냐하면

    JPA가 다 해주거든. 어떤식이냐면 우리가 Java로 명령어를 적어주면 SQL문(생성, 삽입, 조회 명령문)으로 번역해주거든?

    그럼 JPA가 뭔지 알아보자

    JPA, Repository

     

    -  JPA(Spring Data JPA) : Java로 코드를 작성하면 SQL로 번역해줄 뿐만 아니라,  기본적인 기능이 거의 들어있다.

    쉽게 말하면

    스프링은 자바로 작동하고, 데이터베이스는 SQL로 작동한다!

    한국어와 영어 사이에는 번역기가 필요하듯. 자바를 위한 번역기 = JPA !!!

    1) Domain, Repository 이란?

    스프링 (오라클디벨로퍼, MySQL, 포스그레 디비 등등)
    Domain Table
    Repository SQL(생성, 삽입, 조회 명령문)

    표를 보면 동일한 개념으로 적어두었다.

    Domain은 Table 개념, Repository는 SQL 개념을 가지고있다. 

    그러면 Table을 만들떄 Domain 패키지에서 java파일 작성 후 JPA를 통해 테이블을 설정!

    SQL문은 Repository에 패키지 -> java 파일 생성 후 JPA를 통해 쿼리문 설정!

    그럼 코드를 통해서 JAVA클래스 파일로 어떻게 테이블과 컬럼을 만드는지 알아보자

    @NoArgsConstructor // 기본생성자를 대신 생성!
    @Entity // 테이블임을 알려줌!
    public class Course {  //Course라는 테이블(JAVA클래스)를 만들어줌!!
    
        @Id // ID 값, Primary Key로 사용하겠다 의미!
        @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령(구글링 ㄱㄱ)
        private Long id;
    
        @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냄. NOT NULL
        private String title;
    
        @Column(nullable = false)  // 컬럼 값이고 반드시 값이 존재해야 함을 나타냄. NOT NULL
        private String tutor;
    
        public String getTitle() {
            return this.title;
        }
    
        public String getTutor() {
            return this.tutor;
        }
    
        public Course(String title, String tutor) {
            this.title = title;
            this.tutor = tutor;
        }
    }

    여기서 문제! 이건 Domain일까요 Repository일까요?

    정답은 [ Domain ] ~ 패키지에서 만들어야한다!

    (src > main > java > com.sparta.week02 아래 domain패키지 생성)

    아래 Course, CourseRepositiory 자바 파일 생성하는 구조이다. Course를 움직이려면 CourseRepository 허락을 받아야한다.(쉽게 생각하면 ^^:)

    그럼 CourseRepositiory 는 어디있느냐???

    public interface CourseRepository extends JpaRepository<Course, Long> {
    }

    CourseRepository.java 인터페이스를 만드는데 

    또 문제가 생긴다 Interface 란 뭐냐 이거다...

    하필 JPA는 Repository를 통해서만 사용할 수 있다.

    즉 인터페이스는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보면 된다.


    (추가 내용 중요도 별3개 ) : extends 라는 상속 선언한거 다들 아시려나?...

    Tutor extends Person를 해보면

    class Person {
    	private String name; // 멤버변수name
    	private String getName() { 
    		return this.name;
    	}
    }
    
    class Tutor extends Person { // Person 클래스를 상속
    	private String address;
    	
    	//Tutor클래스는 name 멤버변수와 getName() 메소드를 가지고 있음
    }

    자! 이제 JPA를 사용해봐야겠지?

    우선 application.properties에서 복붙 하고

    spring.jpa.show-sql=true
    spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL

     마지막 JPA실행 코드가 또 있다...

    // Week02Application.java 의 main 함수 아래 복붙!
    
    @Bean
    public CommandLineRunner demo(CourseRepository repository) {
        return (args) -> {
    
        };
    }

    이렇게 하고 웹에 접속해서 SELECT * FROM course;해보면 나온다...

    - Repository는 JPA를 작동시키는 매개체다

     

    API, lombok, DTO

     

    우선 시작하기전 복습겸 되집어 보자(이유는 어려우니까 한번더 해서 나쁠건 없자나...)

    1. Controller - 클라이언트 요청을 전달 받는 코드! (요즘 json형식으로 많이 사용하니까 'RestController'로 JSON만 돌려줌)

     RestConroller 만들기 

    src-main-com.sparta.week01 아래 컨트롤러 패키지 생성

    패키지에 CourseController.java 생성

    @RestController
    public class CourseController {
    
        @GetMapping("/courses")
        public Course getCourses() {
            Course course = new Course();
            course.setTitle("스프링");
            course.setDays(28);
            course.setTutor("마법사");
            return course;
        }
    }

    json(=데이터를 서버에서 전달받는 형식을 JSON)이고

    지금 하는건 스프링 서버를 만들고-> 클래스 정보를 json으로 나타내는거라고 생각하면 된다.

    그럼 @GetMapping이 보일텐데 이게 뭐냐면

    웹에선 Get방식으로 정보요청을 하는데 이때 GETMAPPING을 해주면서 

    HTTP://localhost:1234/courses 로 접속시 getCourses()를 실행한다. 그러면 "스프링, 28, 마법사"

    이걸 return받고 RestController니까 JSON형식으로 브라우저에 나타날 것이다.

    자! 복습은 다했고 이제 본격적으로 해보자.

     

    반응형

    댓글

사라져라~얍!