이전 포스팅은 여기로
2023.12.11 - [개발/project] - 개인프로젝트_UKmedicine_1
개발환경
Os : MacOs 13.4
IDE : intelliJ IDEA Edu
FrameWork : springboot 3.2.2 / jpa / thymeleaf
Launguage java 17
DB : MariaDB 11.2.2
DB tool : DBeaver 23.3.0
FrontEnd Design : Bootstrap 5.3.2
Github : https://github.com/gahyeonkwon/uk_medicine.git
작업 목표
기본 개발 환경 구축
테이블 설계 및 생성
Controller 생성 및 Bootstrap 설정
- 기본 개발 환경 구축
- DB tool 다운로드하기
DB tool을 HeidiSQL 쓸지 DBeaver을 쓸지 고민하다가 회사 생활할 때 다른 업체사람들이 DBeaver 을 많이 추천해 줬던 기억이 있어서 DBeaver를 설치했다. 아직까지 HeidiSQL에 비해 조작감은 불편하지만 전반적으로 애플리케이션 로드 속도나 지원하는 내용은 괜찮은 것 같다.
설치 명령어는 다음을 실행했다.
brew install --cask dbeaver-community
springboot + thymleaf + jpa를 사용할 거라 여기에서 필요한 패키지들을 모두 선택하고 다운로드하여 줬다. ( querydsl 은 나중에 동적 쿼리 작성하다가 너무 힘들어서 추가했다 )
- build.gradle 설정
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
implementation 'org.springframework.boot:spring-boot-starter-validation'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' // MariaDB
runtimeOnly 'com.h2database:h2' //h2
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//-- Querydsl 추가
- 데이터베이스 설치하기
macOs 에서 mariadb는 brew를 사용해서 다운로드할 수 있다. 다운로드 과정에서 root 권한이 필요하길래 root 권한으로 진행했다. ( 개인 개발용 노트북이라 권한이 크게 상관없어서 사용했지만 실제 운영환경에서는 root 권한을 사용할 때는 항상 주의하자. )
% sudo -s
입력 후 최초 root 비밀번호를 설정하면 root 권한을 획득할 수 있다.
이다음으로 brew 명령어를 통해 mariadb를 다운로드한다.
brew install mariadb
나는 처음에 brew 가 실행이 안 돼서 터미널에서 brew 위치를 찾아봤더니 opt 하위 bin 폴더에 있길래 직접 실행했는데, 매번 해당 경로로 이동하기 귀찮아서 전역적으로 명령어를 인식할 수 있도록 변경했다. 혹시 같은 문제를 겪는다면 변경하는 방법 알아보기 를 참고 바란다.
install 이 성공적으로 완료되었다면 아래 메시지가 출력된다. 버전은 mariadb from 11.2.2-MariaDB, client 15.2 for osx10.18 (arm64) using EditLine wrapper 가 설치 됐다.
To start mariadb now and restart at login:
brew services start mariadb
Or, if you don't want/need a background service you can just run:
/opt/homebrew/opt/mariadb/bin/mysqld_safe --datadir\=/opt/homebrew/var/mysql
친절하게도 위에 서비스를 실행하는 방법을 알려준다.
brew services start mariadb
cf. 정지 : brew services stop mariadb
재시작 : brew services restart mariadb
정상적으로 실행 됐다면
==> Successfully [시작/정지/재시작 요청] `mariadb` (label: homebrew.mxcl.mariadb) 형식으로 출력되는 걸 볼 수 있다.
이제 설치된 데이터베이스에 접속해 보자.
mariadb
혹시 이것도 실행파일이 제대로 인식이 안된다면 brew를 실행할 때와 마찬가지로 전역에서 명령어를 인식할 수 있게 설정해 주거나, 직접 실행 파일 위치에 들어가서./mariadb 로 실행하면 된다.
DB 서버에 root로 접속하기 위해 ( mariadb는 호스트 별로 같은 아이디라도 패스워드 관리가 따로 되기 때문에 주의하도록 하자.) 초기 기 비밀번호를 지정해 줬다.
> MariaDB [(none)]> select user,host,password from mysql.user; -- user table 확인
+-------------+---------------------------------+----------+
| User | Host | Password |
+-------------+---------------------------------+----------+
| mariadb.sys | localhost | |
| root | localhost | invalid |
여기서 사실문제가 발생했는데
update user set Password = password('1234') where User = 'root';
를 통해 업데이트했더니 오류가 발생했다.
오류 내용은 다음과 같다.
ERROR 1356 (HY000): View 'mysql.user' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
찾아보니까 mariadb 버전이 올라가면서 user table 이 view로 변경 됐더라. view라서 당연히 update 가 안 됐던 거였다. ( 회사에서 4년간 사용할 땐 이런 문제가 없었는데... 생각해 보니 회사는 버전이 10.4를 사용했었다.)
결과적으로는 아래 명령어를 사용해서 성공적으로 비밀번호를 변경했다.
set password for root@'localhost' = PASSWORD('[변경할비밀번호 ]'); -- 비밀번호 변경
flush privileges; -- 적용
-- 정상적으로 변경 된 모습
MariaDB [mysql]> select password, user, host from mysql.user;
+-------------------------------------------+-------------+---------------------------------+
| Password | User | Host |
+-------------------------------------------+-------------+---------------------------------+
| | mariadb.sys | localhost |
| *947CAA37FC6A4F3E7A65E6205B38896468FDDEBC | root | localhost
비밀번호까지 잘 변경되었으니, root 계정에 변경한 비밀번호를 통해 로그인을 시도했다.
그런데 또 오류가 났다.
(conn=18) Access denied for user 'root'@'localhost'
원인으로 Plugin type 이 mysql_native_password 가 아니거나, root 계정에 비밀번호가 지정되어 있지 않을 경우
발생할 수 있다고 해서 확인해 보았는데 둘 다 문제가 없었다.
-- 플러그인 타입 확인
MariaDB [mysql]> select user,host,plugin from user;
+-------------+---------------------------------+-----------------------+
| User | Host | plugin |
+-------------+---------------------------------+-----------------------+
| mariadb.sys | localhost | mysql_native_password |
| root | localhost | mysql_native_password |
| gwongahyeon | localhost | mysql_native_password |
-- 권한 추가
MariaDB [mysql]> grant all privileges on *.* to 'root'@'localhost';
Query OK, 0 rows affected (0.005 sec)
MariaDB [mysql]>
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
구글링 하다가 서버를 껐다 켜보라는 말이 있어서 mariadb server 재기동 후 접속하니 정상적으로 들어가졌다.
마지막으로 내가 생성한 database 와의 연결을 위해 datasource를 설정해줬다.
- application.yml db connect info 설정
datasource:
url: jdbc:mariadb://localhost:3306/[databasename]
driver-class-name: org.mariadb.jdbc.Driver
username: root
password: 1234
uk_medicine이라는 이름으로 database를 생성했고, 포트는 default, 계정 정보는 root로 지정했다.
database 생성부터는 dbeaver를 통해 작업했으므로 따로 기재하지 않겠다.
- 테이블 설계 및 구축
일단 나는 장기 프로젝트로 토이 프로젝트를 시작한 게 아니라 길어야 이주정도 안에 내가 공부한 이론을 실무에서 보다 편하게 적용할 수 있도록 복습 차원에서 구상했기 때문에 DB 구조를 엄청 복잡하진 않지만 연관구조를 포함하도록 작성하고 싶었다.
그래서 정리된 내용은 다음과 같다.
- 재료 ( material ): 약재 종류를 의미
- 레시피 ( recipe ) : 음식을 만들 때 보는 조리 방법처럼, 하나의 완성된 의약품을 만들기 위해 필요한 내용
- 레시피 상세 ( recipe_spec ) : 레시피를 구성하는 약재와 약재별 생산량
- 검색기록 ( history ) : 레시피를 검색한 검색기록 저장
레시피는 사용자가 직접 등록하고, 등록된 재료 안에서 검색해서 선택할 수 있게 구성하려고 했기 때문에 테이블을 나눴다. 사실 처리하는 데이터 양이 크지 않아서 원테이블로 가도 큰 문제는 없었을 것 같은데 나눈 가장 큰 이유는 강제로라도 연관관계를 만들고 싶었기 때문이다.
그리고 테이블을 하나로 합치면 단순하게 레시피를 조회할 때 레시피의 개수가 아니라 레시피 안의 약재개수만큼 데이터가 늘어나는 문제도 있었다. ( distinct 라던지 group by 라던지 방법은 많겠지만 상대적으로 recipe_spec으로 분리된 내용은 상세 페이지에서만 출력될 텐데 굳이? 싶었다.)
아무튼 정리된 테이블 설계는 다음과 같다.
- Controller 생성 및 bootstrap 적용
기본적인 세팅이 끝났으니 본격적인 페이지를 들기 위해 깔끔해 보이는 예제 템플릿을 가져왔다. ( 웹 퍼블리셔 분들은 항상 그립다 )
참고한 bootstrap 주소
https://startbootstrap.com/template/shop-item#google_vignette
static 폴더 하위에 기본 세팅을 해준 것 외에는 따로 특별하게 설정해 준 게 없어서 이 부분은 더 정리할게 없다.
마치며
사실 이 작업들은 git 로그에도 나와있지만 12월부터 1월초까지 진행하다가 중단했다. 작업기간을 2주 정도 잡고 시작했는데 하다 보니까 JPA에 대한 이해가 부족하다는 생각이 들어서 기본서 외에 인프런에 있는 김영한 님의 JPA 커리큘럼 강의를 모두 들었다. 다 듣고 작업하다 보니까 쿼리 짜기가 너무 불편한 거다! 그래서 Querydsl 도 공부했다. 이제 제대로 적용해 볼 수 있겠다 싶었는데, 지원했던 회사에서 과제물을 던져줬다. 급하게 그걸 만드느라 작업이 또 밀렸다. 그 사이사이에 정보보안준비도 하고, 전에 다니던 직장 동료들이랑 여행도 한번 다녀오고, 이사준비도 하게 되면서 고양이 합사까지 시키느라 회사 다닐 때 보다 바쁜 하루하루를 보냈다. 일은 벌여놓고 계속 미뤄지는 것 같아서 마음이 너무 안 좋았는데 드디어 열흘정도 간 정말 아무것도 없다! 이렇게 시간 나기도 오랜만이라 이번엔 기필코 배포까지 완료하려고 한다.
실무에서 프로젝트 마감기한 엄수를 굉장히 중요하다고 생각하는 사람이라 계속 작업이 미뤄지니 속이 갑갑했는데 다시 진행할 수 있어서 너무 다행이다.
그럼 작업을 하면서 발생했던 오류들에 대해 하나씩 기록하는 글로 찾아오겠다
'Dev > Toy Project' 카테고리의 다른 글
개인프로젝트_Ukmedicine_4 ( 종료 ) (1) | 2024.03.09 |
---|---|
개인프로젝트_Ukmedicine_3 (1) | 2024.02.25 |
개인프로젝트_UKmedicine_1 (0) | 2023.12.11 |