start.spring.io 에서 프로젝트를 생성했다.
Dependency는 Spring MVC, Lombok, Postgresql 정도.
처음으로 도커를 사용해봤다.
도커는 Virtual Machine과 비슷한 개념이지만, 하드웨어적으로 훨씬 가볍다.
Virtual Machine은 내 컴퓨터 위에 완전히 새로운 디바이스(w/OS)를 올리는 개념이라면, Docker는 docker Engine과 함께 컨테이너를 올리는 것이다.
개발자는 자신의 컴퓨터 환경에서 코드를 작성하고 서버에 올린다.
하지만, 자신의 컴퓨터 환경과 서버의 환경은 다르다. 따라서, 종속성 문제가 발생할 수 있다.
Docker는 이를 해결하기 위해 완전히 독립된 환경을 제공한다.
Docker Contianer 각각은 완전히 독립된 환경이다.
따라서, 내 컴퓨터던 서버던 똑같이 동작하는 것을 보장해준다.
동료가 Dockerfile과 docker-compose.yml을 작성해서 보내주면, 다음과 같이 실행하면 된다.
처음일 때: docker-compose build + docker-compose up -d
Spring MVC만 공부하다가 처음으로 JPA를 다루어보았다.
로컬 메모리 저장소만 사용하다가 ORM 개념을 처음 접하니 머리가 빙빙 돌았다.
Spring MVC 강의를 듣고 Controller 개념을 빠삭하게 이해해서, 난 이제 웹 애플리케이션을 개발할 수 있을 줄 알았는데 아니었다.
갑자기 Spring Web Layer 개념도 나오고, DTO, domain 등 모르는 개념이 속출했다.
무지성 구글링을 하다가, 안되겠다 싶어서 JPA 강의를 바로 질렀다.
JPA와 ORM 개념을 어느정도 이해할 수 있었지만, 바로 실전에 적용할 수 있는 내용은 아니었다.
그래서 다른 사람이 만든 게시판 프로젝트를 읽어보면서 domain부터 천천히 따라가보았다.
우리가 만드는 것: 주식 분석 및 예측 프로그램
Domain: 해결하고자 하는 문제 영역, 요구사항. 즉 우리의 도메인은 뉴스, 주식, 재무제표, 기업 등이다.
오늘 실제로 구현한 것이다.
domain
repository
여기서, 모든 Repository는 JpaRepository를 상속하는 인터페이스이다.
내용은 채우지 않아도 된다.
스프링 부트가 자동으로 다음과 같은 메소드들은 생성하도록 설계해주기 때문이다.
- findAll(), findAllById(),
- saveAll()
- getOne(), findById()
- flush(), saveAndFlush()
- count(), existsById()
- delete, deleteById, deleteAll()
DTO
테스트코드
Service
Entity에는 setter를 작성하지 않는다.
setter는 의도가 불분명하고, 변경하면 안되는 값임에도 변경가능한 값으로 착각할 수 있다.
따라서, setter대신 setter와 비슷한 메소드를 만들어서 사용한다.
https://skatpdnjs.tistory.com/13
Spring Web Layer
ORM을 사용하면 쿼리 작성을 안해도 된다.
application.yml에서 아래의 코드를 작성하면 hibernate가 작성한 쿼리를 볼 수 있다.
show_sql: true
format_sql: true
단위 테스트할 때, 빌더 패턴을 사용해서 stock 객체를 만들고 테이블로 쐈다.
근데 오류가 발생했다.
알고보니, 빌더 패턴에서 제외되었던 stockId
필드가 입력되지 않아서 발생한 오류였다.
postgresql 연결
version 2.25.0 이상부터는 docker-compose.yml에서 version 라인을 없애야 동작한다.
잡다한 오류들
enable annotaion processing
SQL Warning Code: 0, SQLState: 00000
build and Run using Intellij 등..
확인이 필요한 부분: FinancialStatement 의 year 변수
DTO 저렇게 쓰는 거 맞는지
Service에 비즈니스 로직 쓸건지
잠자기 직전에 좋은 레퍼런스 사이트를 발견했다,..... 내일 봐야겠다.