[Spring Boot] TIL - 2 스프링부트의 기본 요소 1 (점프 투 스프링부트 2-01 ~ 2-05)

하이초·2022년 8월 15일

Spring_Boot

목록 보기
2/11
post-thumbnail

1. 스프링부트 프로젝트의 구조

  • src/main/java 디렉토리
    main -> java 디렉터리는 자바 파일을 작성하는 공간으로
    컨트롤러, , DTO, 데이터 베이스 처리를 위한 엔티티, 서비스 파일 등이 있을 수 있다

  • ProjectnameApplication.java
    <프로젝트명> + Application.java 파일은 시작을 담당하는 파일이다
    해당 클래스에는 반드시 @SpringBootApplication 애너테이션이 적용되어 있어야 한다
    위 애너테이션을 통해 스프링부트의 모든 설정이 관리된다

  • src/main/resources 디렉토리
    자바 파일을 제외한 HTML, CSS, JS, 환경파일 등을 작성하는 공간이다

  • templates 디렉토리
    resources의 하위 디렉토리로 템플릿 파일을 저장한다
    템플릿 파일이란 HTML 파일 형태로 자바 객체와 연동되는 파일이다
    해당 디렉토리에는 프로젝트의 질문 목록, 질문 상세 등의 HTML 파일을 저장한다

  • static 디렉토리
    프로젝트의 스타일시트(.css), 자바스트립트(.js), 이미지 파일(.jpg, .png)등을 저장하는 공간이다

  • application.properties 파일
    application.properties 파일은 프로젝트의 환경을 설정한다
    프로젝트의 환경, 데이터베이스 등의 설정을 이 파일에 저장한다

  • src/test/java 디렉토리
    프로젝트에서 작성한 파일을 테스트하기 위한 테스트 코드를 작성하는 공간이다
    Junit과 스프링부트의 테스팅 도구를 사용하여 서버를 실행하지 않은 상태에서 src/main/java 디렉토리에 작성한 코드를 테스트할 수 있다

  • build.gradle 파일
    gradle이 사용하는 환경 파일로 groovy를 기반으로 한 빌드 도구로 Ant, Maven과 같은 이전 세대 빌드도구의 단점을 보완하고 장점을 취합하여 만든 빌드 도구다
    해당 파일에는 프로젝트를 위해 필요한 플러그인과 라이브러리 등을 기술한다

2. controller

컨트롤러란,

  • 사용자의 요청이 진입하는 지점(entry point)
  • 요청에 따라 어떤 처리를 할지 결정
    - 단 컨트롤러는 단지 결정만 할 뿐, 실질적인 처리는 서비스(Layered Architecture)에서 담당
  • 사용자에게 View를 응답으로 보내줌

그렇다면 컨트롤러를 쓰는 이유?

  • 하나의 클래스에서 모든 서비스를 처리하는 것이 아니라, controller라는 중간 제어자 역할을 만들어 A 요청은 A-controller가 맡아 필요한 로직처리를 위한 서비스를 호출
  • controller는 MVC 패턴에 포함되며, 역할분담이 핵심
  • 스프링부트는 페이지 요청이 발생하면 가장 먼저 컨트롤러에 요청된 페이지의 URL 매핑이 있는지 조사

컨트롤러 사용 방법

  • @Controller: 해당 애너테이션이 붙은 클래스가 스프링부트의 컨트롤러가 됨
  • @RequestMapping("URL"): 요청된 URL과의 매핑을 담당
    - 도메인명과 포트는 서버 설정에 따라 변하기 때문에, http://localhost:8080과 같은 도메인명과 포트는 적지 않는다
  • @ResponseBody: URL 요청에 대한 응답으로 문자열을 리턴
    - 이 애너테이션을 생략하면 controller 클래스의 메소드가 리턴하는 문자열 이름을 가진 템플릿 파일을 찾게 된다

참고: Controller 사용 예제 등

3. JPA

하 벌써 혼미해지기 시작한다 하지만 정신줄 붙잡고 더 써본다

  • ORM
    이렇게 쉽게 알면 안되겠지만, 쉽게 생각하면 SQL 몰라도 데이터베이스 쓸 수 있지롱 ! 같은 느낌...
    그치만 우린 팀원이 db를 맡기로했고, 나도 sql문을 배우기로 했으니까 이거는 일단 이번 sbb 프로젝트를 하며 익혀두는 것으로!
    ORM을 사용하면 내부에서 sql 쿼리를 자동으로 생성해 주므로 자바만 알아도 데이터베이스에 질의할 수 있게 된다

이제 진짜 JPA!

JPA는 자바 진영에서 ORM(Object-Relational Mapping)의 기술 표준으로 사용하는 인터페이스의 모음이다

  • JPA는 인터페이스다. 따라서 이를 구현하는 실제 클래스가 필요하다.
  • JPA를 구현한 대표적인 실제 클래스에는 하이버네이트(Hibernate)가 있다.

사실 또 남음! JPA를 사용하기 전에 H2 데이터베이스를 설치하고 연결해 볼 것이다
Oracle, Mysql 같은 db들이 있지만, sbb 프로젝트에서는 경량 데이터베이스인 h2를 활용!

❓h2

  • 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 경량 데이터베이스
  • 개발시에는 h2를 사용하여 빠르게 개발하고 실제 운영시스템은 좀 더 규모있는 db를 사용하는 것이 일반적인 개발 패턴

홈 디렉토리에 local.mv.db 파일 생성을 마치고 나면 http://localhost:8080/h2-console으로 접속하여 콘솔화면에 접근할 수 있다

그리고 spring-boot-starter-data-jpa 를 gradle에 추가해주면 이제 진짜 jpa를 사용할 수 있게 되는 것 같다

그리고 프로퍼티 파일도 수정!
이 프로퍼티 파일은 디자인패턴 공부시에 잠깐 봤던 부분인데, 실 사용을 보니 재밌다
나중에 프로젝트할 때 많이 참고할 수 있을 것 같다

4. 엔티티

엔티티는 DB 테이블의 행을 나타낸다
@entity 애너테이션을 붙이면 테이블과 자바 클래스가 매핑되고 다른 엔티티와 관계를 맺을 수 있다
이러한 관계 메타데이터는 클래스에 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany 와 같은 애네터이션을 통해 설정할 수 있다
JPA 애너테이션 참고

엔티니는 JPA가 생성할 때 기본 생성자를 이용하므로 반드시 기본 생성자를 가져야 하며,
식별자 프로퍼티(@Id)가 반드시 존재해야 한다

해당 엔티티에 어떤 속성들이 필요한지 잘 생각해봐야겠군!!!

5. 레포지터리

위에서 만든 엔티티로는 데이터베이스에 데이터를 저장하거나 조회할 수 없다
데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리가 필요!

리포지터리 = 인터페이스!
기본적으로 findAll, save, findById, delete와 같은 메소드들을 가지고 있다
데이터 CRUD와 깊은 관련!!!

@Autowired 애너테이션은 객체를 선언만 해둬도 알아서 스프링이 자동으로 생성해준다 ㄴㅇㄱ
벗! 순환참조(?)으 문제 등으로 생성자를 통한 객체 주입방식이 권장된다고 한다.
하우에버! 테스트 코드에서는 생성자를 통한 주입이 불가하여 테스트 코드에는 위 애너테이션을 사용한다

진짜,, 내 생성자는 몰까,,?

레포지터리가 잘 작동하는 지 테스트 할 때에는 실 서버는 닫고 해야한다.

참고할만한 JPA 레포지토리 메소드
1. findAll: 모든 데이터 조회
2. findById: 매개변수로 넘겨준 id 조회

만약 내가 필요한 메소드가 있다면 findBySubject(String subject)와 같이 메소드를 만들면 된다

그리고 메소드명에 위 항목들을 추가하면 알아서 해당하는 쿼리문의 where 조건을 결정해준다!

예를들어 findBySubjectAndContent 하면 알아서 subject하고 content 컬럼에서 찾아온다는 거다.. 대박..

기타

pom.xml?

  • 라이브러리의 다운로드 및 삭제를 담당하는 파일

오늘의 미결사항

  1. gradle 파일에 의존성을 추가하고, sts 같은 경우는 refresh gradle project 메뉴가 있는데 나는 이걸 인텔리제이에서 도통 못찾겠다..
    한참을 헤매다가 갑자기 왠 코끼리 버튼이 화면에 떠있길래 눌렀더니 내가 기대했던 동작을 하긴 했는데..
    그냥 뭔가 수정되면 그 아이콘이 뜨는거 같긴한데... 나중에 더 찾아봐야겠다...
profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글