[TIL] 3월 8일

yeon·2021년 3월 10일
0

WebMvcConfigurer 인터페이스 구현클래스에서 addViewControllers()오버라이딩

GET요청에 대해 추가적인 로직없이 뷰만 리턴해주면되는 경우 ViewController를 이용해서 뷰를 매핑한다.

[Spring Boot/Spring Web MVC] ViewController를 이용해서 뷰 매핑하기

h2-console 접속하는데 계속 404에러만 떴다. 구글링해보고 h2 버전도 1.4.200, 1.4.197로 해보고 runtimeOnly 'com.h2database:h2' 이것도 추가했는데 계속 white label 에러만 떴다.

→ 프로젝트를 아예 껐다가 다시 open 하니깐 해결되었는데 예외 발생 org.h2.jdbc.JdbcSQLNonTransientConnectionException: Unsupported connection setting "MVCC" [90113-200]

→ h2 1.4.200 버전부터 MVCC 옵션이 제거되었다.

H2 MVCC에 관해서 - 인프런 | 질문 & 답변

application.properties에서 MVCC=true 부분 삭제하고mem 추가해서

spring.datasource.url=jdbc:h2:mem://localhost/~/java-qna;DB_CLOSE_ON_EXIT=FALSE

이렇게 변경하니 해결

JDBC

Java Database Connectivity

자바에서 데이터베이스에 접속할수 있도록 하는 자바 API

JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

@Entity

User 클래스가 데이터베이스와 연결되는 것이라는걸 알려주기 위해서 User클래스에 @Entity 어노테이션을 붙인다

테이블을 객체화 시킨것

[JPA] 엔티티 매핑 #1

JPA를 사용할때 entity와 테이블을 정확히 매핑해야한다.

  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 꼭 붙여야한다
  • @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라 부름
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 20)
    private String userId;

    private String password;
    private String name;
    private String email;

		...
}
  • @Id : 해당 프로퍼티가 primary key 역할을 한다는 뜻

  • @GeneratedValue : primary key의 자동 생성 전략 명시

    → 데이터베이스에서 자동으로 id 값을 1씩 증가시킨다.

  • @GeneratedValue(strategy = GenerationType.IDENTITY)

    : DB의 identity 컬럼을 이용한다는 뜻

  • @Column(nullable=false)

    : null 값이 들어가지 못하게 하는것

spring.datasource.url=jdbc:h2:mem:spring-boot-qna;DB_CLOSE_ON_EXIT=FALSE

여기서 mem 은 메모리 디비를 써서 처리를 하겠다는 뜻

UserRepository 인터페이스 추가

JpaRepository<User, Long> extends 하기

→ User를 담는거고 id의 타입은 Long임을 명시

→ 데이터베이스에 데이터를 추가하고, 꺼내오도록하는 기능 추가한것임

CrudRepository 검색 루카스는 CrudRepository 상속하라하고 자바지기님은 JpaRepository 상속한다.

JpaRepository와 CrudRepository의 차이?

What is difference between CrudRepository and JpaRepository interfaces in Spring Data JPA?

JpaRepository가 CrudRepository를 상속받고있다.

→ JpaRepository는 CurdRepository가 갖고있는 메소드들을 포함하고 있음

  • CrudRepository : CRUD 기능 제공
    • crud 란? : Create(생성), Read(읽기), Update(갱신), Delete(삭제)
  • JpaRepository : JPA와 관련된 메소드 제공 such as flushing the persistence context and deleting records in a batch.

[JPA] 플러시(Flush)란 - Heee's Development Blog

플러시(Flush) : 영속성(persistence) 컨텍스트의 변경 내용을 DB에 반영하는것


JpaRepository와 CrudRepository는 인터페이스인데 왜 extends를 하는거지?

Why do we extend JpaRepository Interface and not implements it

인터페이스는 다른 인터페이스를 extends 하는거고

클래스가 인터페이스를 implements 하는 것

UserController에 기존의 List를 삭제하고 UserRepository타입 속성을 추가해주고, CrudRepository인터페이스의 메소드를 이용하는 걸로 코드를 다 변경함

→ /users/signUp 페이지에서 회원가입을 진행하고 submit하면 500 에러 발생, User 테이블이 생성되지 않았다는데 왜지..

2021-03-08 23:39:47.199 ERROR 6081 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Table "USER" not found; SQL statement:
insert into user (id, email, name, password, user_id) values (null, ?, ?, ?, ?) [42102-200]
2021-03-08 23:39:47.211 ERROR 6081 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, email, name, password, user_id) values (null, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause

There was an unexpected error (type=Internal Server Error, status=500).

could not prepare statement; SQL [insert into user (id, email, name, password, user_id) values (null, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, email, name, password, user_id) values (null, ?, ?, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

→ 해결

삽질 엄청했는데..

application.properties에서 spring.datasource.url=jdbc:h2:~/spring-boot-qna를

jdbc:mem:h2:~/spring-boot-qna로 바꾸고

h2-console에서도 JDBC URL을 바꾼 URL(mem이 포함된)로 connect 해주니 실행된다.

어쩐지 전에 왼쪽 목록에 USER 테이블이 없었는데 바꾸니깐 생겼다. 왜 mem을 안붙여주면 문제가 발생하는지 모르겠다.

  • mem의 의미? in-memory 기능으로 구동하겠다는 뜻
    - 다른 기능으로 디스크 기반의 저장 방식도 있음 (데이터의 영속성)

@Autowired란?

각 상황의 타입에 맞는 IoC컨테이너 안에 존재하는 Bean을 자동으로 주입하게 하는 것


  • persistence : 지속됨
  • in turn : 결국, 결과적으로

오늘 한일

  • 이번과정에서는 당장 필요하지 않은 부분까지 노션에 정리하지 말자. 당장 구현하는것이 뭔지 이해하는데 집중하자. 한번 훑어보는 과정이다.
  • 오늘도 역시 삽질하다가 하루가 갔다. 미션2 시작, 사용자 데이터 DB에 저장하는거 구현하는데만 오늘 하루를 다썼다.

Todo

(내일)

  • 제대로 학습해보자.

JPA, Hibernate, 그리고 Spring Data JPA의 차이점

  • 수업한거랑 루카스 부분 간략히 공부하기

    수업시간에 주워들은 궁금한것들, 미션해야되니깐 간략하게만 찾아보자

    • 인캡슐레이션, 디캡슐레이션?
    • cors 문제?
    • DNS 스푸핑?
    • DNS 서버 원리 루카스에 있는거
    • REST API
    • HTTP 메소드

0개의 댓글