웹개발의 봄, Spring 2주차 - 1

귀찮Lee·2022년 3월 30일
0
post-custom-banner

2022년 3월 29일(화) ~ 30일(수)
[스파르타코딩클럽] 웹개발의 봄, Spring 2주차 과정 - 1

◎ RDBMS

  • RDBMS란? : Relational DataBase Management System / 컴퓨터에 정보를 저장하고 관리하는 기술, 성능/관리 면에서 매우 고도화된 엑셀
  • RDBMS의 종류 : MySQL, PostgreSQL, Oracle Database ...

◎ H2

  • H2 : In-memory DB / 인메모리 DB란 서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스 (연습용으로 사용할 예정)
  • H2 웹콘솔 띄워보기
    src > main > resources > application.properties 에 추가
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb

Application 실행 후, http://localhost:8080/h2-console 접속, connect 클릭

◎ SQL 연습하기

  • 엑셀 파일 하나가 "데이터베이스"라면,
    엑셀 시트 하나는 "테이블"이라고 부르고,
    엑셀 행 하나는 "데이터"라고 부릅니다.
// 데이터 생성하기

// IF NOT EXISTS 존재 안하면
// NOT NULL 어느 하나라도 비면 안된다
// bigint(5) Long 을 가르킴 (정수)
// varchar(255) String을 가르킴
// PRIMARY KEY (id) 행/데이터 하나하나를 구분해주는 유일한 값으로 삼음
// AUTO_INCREMENT 자동으로 증가하게 값 부여 

CREATE TABLE IF NOT EXISTS courses (
    id bigint(5) NOT NULL AUTO_INCREMENT, 
    title varchar(255) NOT NULL,
    tutor varchar(255) NOT NULL,
    PRIMARY KEY (id)
);

// SQL 데이터 삽입

// INSERT INTO 데이터 넣어줘
INSERT INTO courses (title, tutor) VALUES
    ('웹개발의 봄, Spring', '남병관'), ('웹개발 종합반', '이범규');

// SQL 데이터 조회하기
SELECT * FROM courses;
  • 직접 SQL을 사용하는게 아니라, Spring Data JPA를 사용하므로 참고하항으로 알도록 하자

◎ JPA

  • JPA란? : SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기

  • JPA Domain == SQL Table
    JPA Repository = SQL SQL

  • @ 붙은것들 : 어노테이션(Annotation) : ~~ 역할이 있다고 알려주는거

//Application.java

@EnableJpaAuditing // 생성, 수정 일자에따라 날짜가 자동으로 업데이트
@SpringBootApplication
public class Week02Application {

    public static void main(String[] args) {
        SpringApplication.run(Week02Application.class, args);
    }

    @Bean // @Bean은 다음 단계에서 알아가도록 하자
    // 해당 아래코드가 중요!
    public CommandLineRunner demo(CourseRepository repository) {
        return (args) -> {
        	// 생성자를 통해 Course 생성
            Course course1 = new Course("웹개발의 봄 Spring","남병관");
            // 생성한 course1을 repository를 이용해 database에 저장
            repository.save(course1);
            
			// repository를 이용해 Database에 있는 정보 불러오기
            List<Course> courseList =  repository.findAll();
            for (int i=0; i<courseList.size(); i++){
            	// 여기에서 c를 sout하면 package 형식으로 print되므로 Course의 getter를 통해서 인쇄
                Course c = courseList.get(i);
                System.out.println(c.getTitle());
                System.out.println(c.getTutor());
            }
        };
    }
}

// Course.java

@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@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;


    //Getter
    public String getTitle() {
        return this.title;
    }

    public String getTutor() {
        return this.tutor;
    }

    //생성자
   public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}



// CourseRepository.java    interface 형식

//JPA는 Repository(Interface)를 통해서만 사용할 수 있습니다.
//Interface는 클래스에서 멤버가 빠진, 메소드 모음집이라고 보시면 됩니다.
import org.springframework.data.jpa.repository.JpaRepository;

// extend : 다른 기능을 가져와서 이용한다. JpaRepository<데이터베이스 이름, id의 자료형>
public interface CourseRepository extends JpaRepository<Course, Long> {
}
  • Course 에서 setter 설정 안하는 이유 -> Repository에서 자동으로 해줌

◎ 클래스의 상속 / 생성일자, 수정일자

// Timestamped.java

@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
// abstract : 직접 구현이 안됨, 상속으로만 사용 가능
public abstract class Timestamped { 

    @CreatedDate // 생성일자임을 나타냅니다.
    private LocalDateTime createdAt;

    @LastModifiedDate // 마지막 수정일자임을 나타냅니다.
    private LocalDateTime modifiedAt;
}

// Course.java의 일부
// extends를 통해  Timestamped의 내용을 가지고옴
public class Course extends Timestamped{
}
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글