게시판 프로젝트를 구현해보자
지난번 환경 세팅에 이어서 Spring Boot를 사용한 CRUD 기능을 갖춘 게시판 프로젝트 구현 과정을 남겨보려 합니다.
위와 같이 새로운 Spring Boot project를 만들어주고
종속성인 이렇게 설정한 채로 시작합니다.
Web, XML 리소스가 잘 인식 안 되는 문제를 방지하려면 Web, XML, Java EE and OSGI Enterprise Development라는 이름의 소프트웨어를 설치해야 하는 것 같은데, 왜인지 그대로 따라 해도 검색이 안돼서 일단 건너뜁니다..
그러던 중에 thymeleaf를 빼놓고 프로젝트를 생성해서 다시 만들어 줬습니다.
Thymeleaf Eclipse 플러그인은 위 키워드를 직접 입력해서 설치해줍니다. (Help > Install New Software 옵션 선택함)
분명 아직 개발은 시작도 안 했고, 환경 설정만 하고 있는데 처음 해서 그런지 조금? 많이 복잡한 것 같긴 합니다.. express로 구현할 때 너무 편했어서 약간 비교되는 느낌도 있는 것 같습니다.
프로젝트 폴더 구조 확인
어쨌든 이어서 프로젝트 구조를 정리해 보겠습니다. (파일이 너무 많아서 간략하게 나마 정리하고 코드를 짜야될 것 같습니다.)
방금 만든 board 프로젝트의 구조는 위와 같습니다. 이 중에서 일단 src/main/java 디렉터리부터 보면은
이렇게 구성되어 있고, 여기에는 클래스, 인터페이스 등의 자바 파일이 위치한다고 합니다.. 코딩을 하다 보면 뭔 소린지 깨달을 것 같으니 일단 넘어갑니다.
저기 위에 있는 BoardApplication.java 파일에는 com.board.BoardApplication이라는 이름의 클래스가 미리 생성되어 있는데, method로는 main이라는 이름의 method가 하나 생성되어 있고, 이는 SpringApplication.run method를 호출해서 웹 어플리케이션을 실행하는 역할을 담당한다고 합니다.
또 Spring에서는 Annotation이라는 것을 많이 사용한다고 하는데, 이는 사전적으로 주석을 의미하지만, Java에서는 주석 이상의 의미를 표현한다고 합니다.
Annotation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로 소스코드에 추가 시 단순 주석의 기능을 넘어 특별한 기능을 사용할 수 있다.
위 코드에 있는 @SpringBootApplication도 Annotation의 일종으로 @SpringBootApplication은 다음의 세 가지의 annotation으로 구성된다고 합니다.
@EnableAutoConfiguration
@CompoenentScan
@Configuration
각자 무슨 역할을 하는지는 다음에 공부해 보도록 하고(거의 글 한 개 분량을 넘어서는 개념인 것 같아서..😅), 이어서 구조를 살펴봅니다.
다음으로는 src/main/resources 폴더를 살펴봅시다.
저번 글에서는 static 폴더에 index.html을 간단하게 작성해서 웹 서버를 구동해 봤는데, 이 폴더에는 위와 같이 Spring Boot project를 생성 시 templates, static 폴더와 application.properties 파일이 기본적으로 생성됩니다.
각각의 폴더의 역할은 다음과 같이
templates: Spring Boot는 타임리프(Thymleaf) template engine의 사용을 권장하는데, 이러한 템플릿 엔진들을 저장하는 폴더라고 합니다.
static: HTML, CSS, JS, Images 등 다양한 정적 리소스들을 저장하는 폴더
application.properties: 웹 어플리케이션을 실행하면 자동으로 로딩되는 파일로 톰캣(Tomcat)? 과 같은 WAS(포트 번호, context pass 등)? 의 설정을 key-value 쌍의 형식으로 작성하는 파일
다음은 build.gradle 파일입니다.
이 gradle은 기존 Spring에서 사용하던 메이븐(Maven, 라이브러리 관리 방식)을 사용하는 경우 라이브러리의 버전 충돌 문제와 종속성 문제 등 다양한 문제들이 발생하여, 요즘에는 gradle 방식을 선호하는 추세라고 합니다.
메이븐은 하나의 라이브러리 추가에 네 줄? 정도가 넘어가는 코드가 필요하다 하는데, gradle에서는 단 한 줄의 코드만 있으면 되는 점 또한 gradle의 장점 중 하나라고 합니다!
build.gradle에서 추가한 라이브러리는 Project and External Dependencies 여기에서 확인할 수 있다고 합니다.
DataSource 설정
application.properties 파일에 다음과 같이 작성합니다.
각각의 줄이 무슨 의미인지는 일단 차차하고 따라서 코딩을 진행해보겠습니다. (지금 시점에서는 갈수록 정리할 엄두가 안 납니다..)
다음으로는 위 폴더 경로에 Configuration 폴더를 생성하고, 그 아래에 DBConfiguration.java 파일을 생성한 뒤에 다음과 같은 코드를 작성합니다.
위에 코드는 정말 뭐가 뭔지 잘 모르겠습니다.. 그래도 일단 계속 이어서 코딩을 진행합니다.
앞서 두 개의 파일에 코드를 작성하면서 annotation을 많이 사용했는데, 각각의 annotation에 대해 정리하면
@Configuration // 자바 기반의 설정 파일로 인식
@PropertySource // 해당 클래스에서 참조할 properties 파일의 위치를 지정
@Autowired // 빈(Bean)?으로 등록된 instance(객체)를 클래스에 주입하는데 사용한다.
@ApplicationContext // Spring Container 중 하나로 빈(Bean)의 생성과 사용, 관계 및 생명 주기 등을 관리
@Bean // Configuration class의 method 레벨에서만 지정 가능한 annotation, @Bean이 지정된 객체는 컨테이너에 의해 관리되는 빈으로 등록됨
@ConfigurationProperties // 인자에 prefix 속성을 지정할 수 있게 하는 annotation
@hikariConfig // 히카리CP 객체(connection pool 라이브러리중 하나라고 한다.)를 생성
@dataSource // 데이터 소스 객체(connection pool을 지원하기 위한 라이브러리 중 하나) 생성
@sqlSessionFactory // SqlSessionFactory 객체 생성
/*
SqlSessionFactory는 DB의 connection과 SQL 실행에 대한 모든 것을 갖춘 중추적 역할을 수행하는 객체
mybatis와 spring의 연동 모듈로 사용되는데, mybatis의 XML mapper, 설정 파일의 위치 등을 지정하고
SqlSessionFactoryBean 자체가 아닌, getObject method가 반환하는 SqlSessionFactory를 생성함
*/
@sqlSession // sqlSession 객체를 생성
/*
1. SqlSessionTemplate은 mybatis spring 연동 모듈의 핵심
2. SqlSessionTemplate은 SqlSession을 구현하고, 코드에서 SqlSession을 대체하는 역할을 수행
3. SqlSessionTemplate은 thread에 안전하며, 여러 개의 DAO나 Mapper에서 공유 가능
4. 필요한 시점에 session을 닫고, commit or rollback 하는 작업 등을 포함한 session의 생명 주기를 관리
요약하면 SqlSessiontemplate은 SqlSessionFactory를 통해 생성되며, DB의 commit, rollback 등 SQL의
실행에 필요한 모든 method를 갖는 객체라고 할 수 있다고 합니다..
*/
이렇게 정리를 해 봤는데, 사실 개념적으로 한 번 봐서는 잘 이해가 안 가서.. 앞으로 코드도 짜 보고 필요한 개념 공부를 병행하다 보면, 이해할 수 있지 않을까 싶습니다. 😂
다음으로 테스트 코드를 src/test/java 디렉터리의 BoardApplicationTests 클래스 파일을 열어 다음과 같이 작성합니다.
이것 또한 아직은 무슨 뜻인지 잘 모르겠지만, @Test 이건 test 코드임을 지정하는 annotation인 것? 같습니다.
Junit으로 위 test code를 실행했으나 ApplicationContext 로드에 실패했다는 로그만 뜨고, 그대로 따라 했음에도 도저히 이유를 모르겠어서 일단 오늘은 여기까지 진행해보려 합니다..
'BackEnd > java spring' 카테고리의 다른 글
Spring 이란? (0) | 2022.12.23 |
---|---|
[Java] 자바 공부 - 3, 리터럴(literal)의 개념과 자료형 간단 정리 (0) | 2022.11.30 |
[Java] 자바 공부 - 2 (static vs non-static) (0) | 2022.11.28 |
[Java] 자바 공부 시작 - 1 (자바가 동작하는 방식) (0) | 2022.11.23 |
SpringBoot를 시작하기 위한 환경 세팅하기! (1) | 2022.10.01 |
댓글