Spring Boot 입문 개괄 (항해일지 12일차)

김형준·2022년 5월 20일
0

TIL&WIL

목록 보기
12/45
post-thumbnail

오늘은 주특기 주차가 시작된 날이다!
2 주를 돌아보면 크게 아래와 같다.

  • Python-Flask-MongoDB 기반의 웹 구현
  • Java 개념 및 문법 학습 by 알고리즘 풀이

첫번 째 주간에는 웹이 구현되는 전체적인 구조(아키텍처)에 대한 이해도를 얻었다면, 두번 째 주간에는 실제 나의 무기, 주특기로 연마할 스프링의 언어인 Java에 대한 이해도를 얻는 시간이었던 것 같다.

웹과 주특기 언어에 대한 이해도를 가지고 주특기 공부에 들어가기에 꽤 괜찮은 커리큘럼이라고 다시금 생각했다. 👍

물론 스프링은 그렇게 호락호락하지 않겠지만, 3주간의 주특기 학습 기간동안 죽어라 달려들어 친해질 것이다!

1. 학습 일지 (Spring Boot)


1) 환경 설정

  • Java는 8버전을 사용
  • 빌드는 Gradle
  • 초기 프로젝트 생성 시 추가하는 5가지 Dependencies
    • Spring Web
    • Spring Data JPA
    • MYSQL driver
    • H2 Database
    • Lombok
  • 왜 DB를 두 가지나 사용할까 했는데, MYSQL과 H2DB는 모두 RDBMS지만 H2는 In-memory 데이터 베이스로 서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈출 때 데이터가 모두 삭제된다. 즉, 테스트용 데이터베이스로 활용한다.
  • JPA는 생소했다. 예전 국비과정 때는 MyBatis를 사용하여 직접 SQL 구문까지 작성했었는데, JPA는 자바 언어를 SQL언어로 번역해주는 친구라고 한다. 물론 사용 방법은 낮설지만 SQL언어를 따로 공부하지 않아도 되는 장점이 있으니 항해에서는 JPA 사용법을 숙달하는 것을 목표로 설정해야겠다.

2) 관련 개념들

  • RestController에서 Rest는 서버의 응답이 JSON 형식임을 나타낸다.
  • HTML, CSS 등을 주고 받을 때는 Rest를 붙이지 않은 Controller를 사용한다.
  • Controller는 자동 응답기에 비유할 수 있다. 클라이언트의 요청(Request)을 받아 응답(Response)한다.
  • Gradle은 웹을 배포할 수 있게 빌드도 해주며, 다른 사람의 코드(라이브러리)를 가져오는 것도 도와준다.
  • Maven Repository라는 사이트는 Java 환경에서 사용 가능한 다양한 라이브러리의 집합소이다.
  • 만약 라이브러리를 가져오고 싶다면, build.gradle의 dependencies에 붙여넣으면 된다.

3) DB, SQL

  • 오늘은 초기 세팅에서 dependency에 넣어줬던 RDBMS 중 H2의 사용법을 배웠다.
  • H2 관련 설정은 src_main_resources_application_properties에서 해준다.
spring.h2.console.enabled=true // 콘솔에 찍기
spring.datasource.url=jdbc:h2:mem:testdb // db url 설정
spring.jpa.show-sql=true // JPA를 통한 SQL문 보여주기
  • 로컬로 run한 뒤 localhost:포트번호/h2-console을 주소창에 입력하면 H2 콘솔 페이지로 이동한다.
  • 이 때 스프링부트 버전 업데이트에 따라 2.1.10 버전 이후라면 위에 입력한 값 중 url에서, MODE=MYSQL을 붙여줘야 SQL 실행 시 오류가 나지 않는다. 오류코드 [42001-212]
  • 위 오류에 대한 글이 많지 않아서 찾는 데 한참 걸렸다..!
  • 오늘 사용한 SQL 문은 생성, 삽입, 조회 기본문장이다.
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)
);

INSERT INTO courses (title, tutor) VALUES
    ('웹개발의 봄, Spring', '남병관'), ('웹개발 종합반', '이범규');
    
SELECT * FROM courses;
  • 만약 JPA를 사용하지 않는다면 위의 SQL문은 아주 아주 귀엽게 보일 정도의 SQL문을 구사할 수 있어야한다. JPA는 항해의 취지에 맞는 선택인 것 같다.

4) Repository, JPA

  • JPA는 위에도 언급했지만, Java언어를 SQL문으로 자동 번역해주는 친구다.
  • Repository 인터페이스를 생성하여 JpaRepository<>를 extends 해준다.
  • JpaRepository<>의 다이아몬드 연산자에는 Entity 클래스와 Id의 타입을 적어준다. ex)JpaRepository<Person, Long>
  • 강의에서 이에 대한 자세한 설명은 없었지만, 유추해보면 SQL 쿼리문에 들어갈 테이블 정보를 입력받은 Entity 클래스와 매핑하여 자동으로 넣어주는 것 같다.
  • Repository 인터페이스에는 JPA의 다양한 메서드를 사용할 수 있는데 아주 신기했던 점은 메서드 이름을 제작하여 사용할 수 있다는 점이었다.
  • 즉, FindByAllByOrderByModifiedAtDesc() 와 같이 JPA의 키워드와 Entity의 멤버변수 명을 조합하여 만든 문장(메서드명)을 이해한다는 것이다.
  • JPA 키워드 쿼리 Docs

5) Controller(API), Service, DTO

  • DTO는 계층 간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다.
  • 사용 이유는, 클래스 자체를 전달하게 되면 원본 클래스에 대한 무결성, 설계를 망가뜨릴 위험이 있기 때문에 따로 정보만을 담아 전달하는 DTO를 사용하는 것이다.
  • Service는 비즈니스 로직을 담는 공간이다. 사실 처음에는 굳이 service를 구현해야할까 라는 의문이 들었다.
  • 그래서 service를 구현할 때의 장점에 대해 자연스레 공부하게 되었다.
  • 먼저 service는 순수 자바 영역으로, Http 통신을 위한 servlet을 상속 받을 필요가 없다. 이 말인 즉, 불필요한 request, response 없이 독립된 비즈니스 로직을 구현할 수 있는 공간이다.
  • 만약 service 없이 특정 API에서 구현한다면 비슷한 기능이 필요할 때 마다 중복 코드를 작성해야한다.
  • 따라서 service는 재사용성을 장점으로 한다. 이는 모듈화라는 장점으로 이어지고 확장성도 지닌다!
  • 마지막으로 Controller는 클라이언트와의 소통 창구인 API를 구현하는 공간이다.
  • 오늘은 모든 Cotroller를 RestController로 구현했고, 나름 Restful한 API를 구현했다.
  • 여기에서 Restful하다는 주소에 명사(복수형) 동사제외, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미하며 이 외에도 다양한 조건들이 있다. 나중에 배워서 구현해보자~!!
  • Rest 방식으로 GET, POST, PUT, DELETE 4가지를 구현해봤다.
  • ARC(Advanced REST Client)를 사용하여 모두 테스트했다.
  • POST, PUT 방식을 사용할 때는, headers에 Content-Type=application/json을 Body에는 Controller의 @RequestBody와 매핑 될 json 값을 넣어 보내준다.

오늘 공부한 Spring Boot 코드


6) 마무리..

  • 오늘 구현했던 스프링 부트 프로젝트의 디렉 구조는 main 아래 domain, controller, service 총 3개의 패키지로 이루어진다.
  • 그 중 domain에는 Entity 클래스와 이에 해당하는 Repository 인터페이스, RequestDTO를 저장한다.
  • Entity를 기준으로 Repository는 상속받은 JpaRepository<>를 완성하고, RequestDTO는 매핑하여 담아줄 멤버변수들을 정리한다.
  • 이 외에도 분명 배운 내용들이 많았지만, 차차 사용해가며 더욱 깊이있게 공부하고 정리해야겠다.

2. 코멘트

오늘은 2주차 까지의 강의를 듣고 3주차 4강에서 마무리했다.
사실 더 듣고 싶었는데, 지금까지 배운것만 해도 엄청 많았고, 이걸 정리해야 내 머릿속에서도 정리될 것 같아서 마무리했다 😂
예전에 스프링MVC로 프로젝트를 구현했을 때의 고통이 스멀스멀 살아났지만, 약간 백신맞은듯이 덜 고통스러웠다.
빠르게 5주차까지 완강하고 인프런에 김영한님의 강의를 들어볼 계획이다.
지금은 뭔가 필수 코드만을 겨우 이해하며 구현하는 느낌이라, 조금 더 깊이있는 학습을 하고 싶다!
오늘도 고생 많았고 내일도 힘내자!

profile
BackEnd Developer

0개의 댓글