개발 일기

질문게시판 CR 구현(1) Dto 생성자, H2 DB, application properties 설정 [편집 중] 본문

TIL(Today I learned)

질문게시판 CR 구현(1) Dto 생성자, H2 DB, application properties 설정 [편집 중]

flow123 2021. 11. 27. 21:09

스프링 꼬꼬마는 모든 코드들이 낯설다.

그래서 오늘은 하나하나 뜯어보고, 익숙해져봐야지. 

내가 의구심이 가는 코드를 주석처리하면, 우리 친절한 인텔리제이가 하나하나 설명해준다. 

 

아래코드에서, requestDto로 Article 생성자를 만드는 것이 잘 와닿지 않았다. 생성자를 왜 클래스에 만들까? 

 

한번 Article 이라는 객체 클래스와 Article Service를 비교해보자. 

왼쪽 하단의 dto 생성자를 지우면, ArticleService에서 articleRequestDto를 넣은 객체를 생성할 수 없다. 

이떄, Service에서는 cannot resolve a constructor 라는 에러가 뜬다. 클래스에 articleRequestDto가 들어가는 생성자가 있어야만, 서비스에서 객체를 생성할 수 있는 것이다. 

이번에는 클래스 생성자에 requestDto를 지워볼까? (주석 처리) 

 

Dto 안의 title 과 Content 속성을 객체의 멤버변수 title, content 에 매핑하는 생성자다. 

둘의 이름이 같기 때문에, 구분해주기 위에 객체는 this.라고 표시해준다. 

참고로 멤버변수는 클래스 내에서 선언되는 변수다. 

 

원래 requestDto 를 쓰면, 가져오지 않은 객체이니 당연히 cannot resolve symbol 메시지가 뜬다. 

윗 줄을 ArticleRequestDto로 바꿔보니, 빨간 줄은 사라졌지만, getTitle() 을 해결하지 못한다. 

에러메시지는 다음과 같다. 

 

Non-static method 'getTitle()' cannot be referenced from a static context

 

Static 과 non-static의 차이가 뭘까? 

static은 이미 객체화 되어 있어서 바로 사용할 수 있고, 

non-static은 아직 객체화가 되어 있지 않아서 (아직 존재 x) new 키워드로 객체화한 후 (생성 후 ) 사용 가능하다.

 

 

ArticleRequestDto를 빼고 객체 requestDto만 들어간다면? 

역시 resolve 를 할 수 없다고 만든다. Dto가 들어간 생성자를 만들 때,

타입 파라미터(클래스)와 객체를 모두 넣어줘야 한다. 

 

public Article (ArticleRequestDto requestDto) {
    this.title = requestDto.getTitle();
    this.content = requestDto.getContent();
}

 

이 생성자는 클래스에서 생성되어서, Service 와 Controller 를 여행한다 (똑같은 형태로!) 

클래스에서 정의되면,

프론트에서 -> RequestMapping으로 연결되어 Controller 로 -> Service에서 실행 되고 -> Repo 에 저장된다. 

 

아래에 Long id 나 기본 값은, 이미 클래스를 정의하면서 생성되는 생성자이기 때문에, DTO처럼 따로 정의할 필요가 없는 듯 하다. 

 

#데이터를 입력했고, 프론트 Getlist 로도 잘 찍히는데, 인텔리제이 내부 database에는 쌓이지 않는다..

이게 대체 무슨일일까. 며칠 전에는 되었는데??

 

알고보니 AutoSERVER를 설정해야하는데 Application properties에 코드를 지웠다.  뭐가 안될때 이것저것 바꿔놓으니 뭘 바꿨는지도 기억이 안나.. 

 

설정참조 출저: 스프링4 강의노트 

 

application properties 파일도 추가하니, 이제 select 문도 로그에 찍힌다. 

데이터 저장도 잘 되고, get Articles 도 안되던 것이 된다! 아마 db를 생성할 때는 username 을 설정했는데 아까의 application code 에는 username 도 빠져있고 show-sql 도 빠져 있어서. 그랬던 것 같다. 

spring.h2.console.enabled=true

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:./1119db;AUTO_SERVER=TRUE

spring.datasource.username=sa
spring.datasource.password=

spring.thymeleaf.prefix=classpath:/static/
spring.jpa.show-sql=true

spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true

logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace

 

트랜잭션: 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계

-더 이상 쪼갤 수 없는 최소 단위의 작업. 

-모두 저장 or 아무것도 저장되지 않음. 

 

ACID (원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어

롤백(영어: rollback)은 데이터베이스에서 업데이트에 오류가 발생할 때, 이전 상태로 되돌리는 것을 말한다. 후진 복귀라고도 한다.

 

트랜잭션 시작

  1. A 계좌 잔고 200,000 원 이상 확인
    • A 계좌 잔고: 1,000,000 원
  2. A 계좌 잔고 200,000 원 금액 감소
    • A 계좌 잔고: 800,000 원 (1,000,000 원 - 200,000 원)
  3. B 계좌 잔고 200,000 원 금액 증가
    • B 계좌 잔고: 1,200,000 원 (1,000,000 원 + 200,000 원)

모두 성공 시 ⇒트랜잭션 Commit

중간에 하나라도 실패 시 ⇒ 트랜잭션 Rollback

 

<출처: 위키백과, 스파르타 코딩클럽 스프링 강의 >

https://almost-native.tistory.com/368

 

자바 에러 : non-static method cannot be referenced from a static context

넷빈즈, 이클립스에서 Java 프로그램 코딩시 메소드함수 호출할때, non-static method ... 에러를 만나는 경우가 종종 있습니다. 여기서 static 과 non-static 의 차이를 알 필요가 있습니다. static 은 이미 객

almost-native.tistory.com

 

Comments