스마트기기. 안전하게 사용합시다. 좋은 습관을 만들어요. 😀 🙂
2023년 2월 15일 수요일.
https://tt2t2am.tistory.com/m/22
[프로그래밍] SpringBoot JPA, 예약파트 만들기. 1. 공부해보세요~.
스마트기기. 안전하게 사용합시다. 좋은 습관을 만들어요. SpringBoot JPA + QueryDSL. 만들다 보니, 스마트 팩토리. 만들다가만 부분. ... 전에 만들긴 만들었는데... 예약파트부분이요. 다시 보고 있군
tt2t2am.tistory.com
업데이트해서, 위의 자료를 잘 보시면, 개발 할 수 있을 검니다~. 도움이 되었으면 좋겠네요.
좋은 하루, 좋은 개발되세요.
또, 교회. 다녀보세요. 기독교. 전화도 해보세요. 사회에서 쉴 곳. 하고 싶은 말이네요.
저의 글, 봐 주셔서 감사합니다.
--
(전 글)
안녕하세요.
스프링부트 JPA와 QueryDSL로 엔티티마다 비슷한 속성의 코드가 적어지기 마련이죠. 서비스를 기획하고, 엔티티를 만들어갈때에, 반복적인 CRUD. Create (읽기), Read (읽기), Update (수정), Delete (지우기)를 만들어야 하죠.
기획적인 웹 디자인도, 개발에 도움이 되고.... 실제적인 엔티티의 CRUD가 마련된다면, 프로그래밍할 때에, 부담감이 적어진다고 할 수 있죠.
물론, 실제적인 흐름에 따라서, insert와 update가 일어나는 로직자체의 신뢰성. 예를 들면, 수량이 변하지 않아야한다던가, 배송비가 있는지 없는지 등등. 이러한 테스트 코드를 밑작업으로 로직으로 만들고, 해당 엔티티에서 파생되어서, 부가적 정보를 포함해서 만드는 것이 신뢰성이 높다고 생각합니다.
물론, 그렇지만 기본적인 CRUD 게시판이 없다면, 데이터의 인서트. 데모 정보를 저장하고, 기획의 디자인과 맞추어볼때라던지, 개발에 편의성을 높이기 위해서는 이런 작업이 필요하다고 할 수 있습니다.
자동화 코드를 만들어 봤습니다.
해당 git을 인텔리제이에 설치하고... v5버젼을 실행시켜줌니다.
https://github.com/infott2t/SpringAutoCodeJPAEntity3

이런 실행화면을 볼 수 있습니다.

Board0 엔티티. User엔티티. 이렇게 만들어서, 게시판을 구현해보려고 하는군요. Board0엔티티를 만들때에는, User가 맵핑이 되기때문에, 아래 TextArea에 적어주면 되겠죠. User엔티티의 경우에는 적지 않으면 되겠구요. 기본적으로, id, isDel, modifiedDate, createdDate는 적어줘야합니다. isDel과 modifiedDate, createDate는 맨 아래에 적어주세요.
해당 Github업데이트했습니다.
package 기능도 추가했습니다.
그래서, root package. 여기서는 com.example.boardtest가 되겠는데요.
이렇게 적어주면,
패키지를 파일마다 적지 않아도 됨니다.
참조해주세요~.
간단하게 게시판 테이블을 만들어보죠...
사용자 User와 보드, Board0. 이 두 엔티티를 구현해봅시다.
새 스프링부트 프로젝트를 생성해줌니다.
프로젝트의 이름은 BoardTest, Java 11로 했군요. MySQL 사용이구요. ....

뒤의 화면에 선택을 하지는 않구요. build.gradle파일을 편집해서 생성할테니까요. create로 생성해줌니다.
선택을 한다면... 이렇게 되겠죠.

build.gradle파일.
buildscript {
ext {
queryDslVersion = '5.0.0'
}
}
plugins {
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
id 'java'
}
group 'org.example'
version '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
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-starter-validation'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
//implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'mysql:mysql-connector-java'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
//implementation 'org.springframework.boot:spring-boot-starter-security'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.6.8'
//implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
//implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.googlecode.json-simple:json-simple:1.1.1' // JSONArray, JSONObject 사용. FileUpload에서, FileJson의 변환에서 필요하기 때문에.
implementation 'org.springframework.boot:spring-boot-starter-json' //LocalDateTime 충돌방지, ObjectMapper사용할 때.
}
test {
useJUnitPlatform()
}
// Gradle 5.0 이상
def querydslDir = "${buildDir}/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
main.resources.excludes = [ 'static/sql/**', 'static/markup/**', 'static/user/**' ]
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
configurations {
querydsl.extendsFrom compileClasspath
}
build.gradle파일을 편집했다면... 이 버튼으로 인스톨 시켜줌니다. build.gradle파일이 바뀔 때 마다 해줘야하겠죠. 잘 보시면, security관련 스프링부트 부분이 주석처리가 되어있습니다. security부분은, 로그인과 관련있는 부분이죠. 주석을 푼다면, 시작했을때에 로그인화면으로 넘어가게 됨니다. 해당 로직을 만들어줘야하구요~.

조금 기다리면, 빌드가 다 되었다는 메세지가 나옴니다.
이제, 자동화코드를 열어서, 만들 엔티티를 입력해주어요.


C: 드라이브의 category폴더에 엔티티 코드가 생성된 것을 볼 수 있습니다. 날짜와 시간을 찍어주는 군요.

생성된 파일들을 프로젝트에 붙여줌니다.
도메인은, 지금 이 프로젝트라면, com.example.boardtest.domain.board0 이렇게 되겠구요.
컨트롤러 파트는,
com.example.boardtest.firstinstance.controller.firstinstanceurl.domain
com.example.boardtest.firstinstance.controller.firstinstanceusr.form
이렇게 될검니다.
실제 프로젝트에서 만드는 컨트롤러는, com.example.boardtest.controller. ... 이런 식으로 되겠죠~.
현재 생성한 스프링부트에... domain이라는 패키지를 만들어 줌니다.

파일을 복사할 때에, 마우스 오른쪽 버튼을 누르고... Open in 선택, Explorer를 선택하면 편하게 옮길 수 있어요.

board0폴더를 domain으로 옮겨줌니다.
각각 파일을 열고, 맨 윗줄에 pakage를 적어주어요.
package com.example.boardtest.domain.board0;
패키지이름은 해당 파일이 들어있는 폴더 경로. 이렇게 되는군요.

도메인은 다만들었습니다. 타임리프, MySQL 셋팅을 해줌니다.
application.proprerties 파일을 만들어 줌니다. 리소스. resources 폴더에 있습니다.
server.port=8080
# MySQL ??
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB Source URL
spring.datasource.url=jdbc:mysql://localhost:3306/example0?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
# DB username
spring.datasource.username= admin0
# DB password
spring.datasource.password= 1234
# true ??? JPA ??? ?? ??
spring.jpa.show-sql=true
# DDL(create, alter, drop) ??? DB? ?? ??? ??? ? ??. # ??? create? ??, ??? update? ????.
spring.jpa.hibernate.ddl-auto=update
# JPA? ???? Hibernate? ????? ??? SQL? ???? ????.
spring.jpa.properties.hibernate.format_sql=true
#Thymeleaf Setting.
spring.thymeleaf.prefix=classpath:templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.cache=false
spring.thymeleaf.order=0
타임리프. resources 폴더 밑에 templates라는 폴더를 만들어 줌니다.

인텔리제이에서 오른쪽 버튼을 누르고, Open In, Explorer를 선택해서, 폴더를 열어줌니다.

firstInstance폴더를 드래그해서 붙여넣기 해줌니다.
컨트롤러 붙여 넣기. CRUD의 url로 이동하는 컨트롤러도 지정된 경로에 붙여넣기 해줌니다. 위치는, com.example.boardtest.firstinstance. ... 이 위치가 되겠죠. java파일이기 때문에, package를 맨위에 다 적어줌니다.
InstanceUrlBoard0Controller의 패키지의 예.
package com.example.boardtest.firstinstance.controller.firstinstanceurl.domain.board0;
코드에 빨간 글씨에, 마우스를 가져가거나 커서를 놓고, Ctrl+space로 임포트를 해주어요.

현재, UserService라던지, User 엔티티는 없죠. 되는 것만 해줌니다. 먼저 package를 파일 맨위에 다 적어주어야 임포트가 됨니다~.
User 엔티티도 만들고, 파일을 잘 복사 붙여넣기 해줌니다.
Long id;
String name;
String email
String role;
String isDel;
LocalDateTime modifiedDate;
LocalDateTime createdDate;

Impl파일에 import static을 정리해서 다시 해줌니다.
UserRepositoryImpl.java...
import static com.example.boardtest.domain.user.QUser.user;
Board0RepositoryImpl.java...
import static com.example.boardtest.domain.board0.QBoard0.board0;
import static com.example.boardtest.domain.user.QUser.user;
임포트가 다 끝났다면, gradle 빌드를 다시 해줌니다. 글자가 보라색으로 바뀌면 성공~. 그전에 빨간 글자들을 다 바꿔야하죠~.

빌드를 해줄때 잘 안된다면...

querydsl에서 clean으로 시작하는 글자를 더블클릭해서 빌드하고... other의 compileJava로 다시 빌드해보세요.
또 엔티티를 여러개 만들때에 제일 첫 페이지. user의 링크도 걸어주세요.
resources/templates/firstinstance/index.html.
<p><a th:href="@{/administer/instanceurl/user}">Move table, User</a></p>
MySQL. 설치가 되어있어야하구요~. Heidi SQL을 사용하고 있습니다. 좋은 것 같아요.
HeidiSQL - MariaDB, MySQL, MSSQL, PostgreSQL and SQLite made easy
HeidiSQL - MariaDB, MySQL, MSSQL, PostgreSQL and SQLite made easy
What's this? HeidiSQL is free software, and has the aim to be easy to learn. "Heidi" lets you see and edit data and structures from computers running one of the database systems MariaDB, MySQL, Microsoft SQL, PostgreSQL and SQLite. Invented in 2002 by Ansg
www.heidisql.com
사용자는 admin0, 암호는 1234로 생성해 줌니다.
SHOW DATABASE;
#데이터베이스 생성 EXAMPLE0
CREATE DATABASE EXAMPLE0 DEFAULT CHARACTER SET utf8;
#유저 생성 admin0
CREATE USER 'admin0'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
테스트... 잘되네요. user를 먼저 생성해서 아이디를 넣으면...

잘 되는 것을 볼수 있습니다~.
완성이군요~. 공부해보세요~. 글이 꽤 길어졌습니다. 실제로 자바에 대해 조금 이해가 있으시다면... 쉽게 잘 할 수 있을거라고 생각하네요.
엔티티를 설계하고, 쉽게 CRUD를 만드는 방법이였습니다.
좋은 하루, 좋은 개발되세요.
--
저의 글, 봐 주셔서 감사합니다.
'프로그래밍' 카테고리의 다른 글
[프로그래밍] OAuth2.0 연결, 웹앱 일 때 생각해볼 점. 공부해보세요. 재미있네요. (0) | 2023.02.05 |
---|---|
[일상] 프로그래밍, 재미있죠~. AI 만들기 부분. 개발해보세요~. 코드크레인이라는 회사도 있네요. (0) | 2023.02.04 |
[일상] 빠르면 오늘 중에 완성... 스프링부트 JPA + 타임리프... 자동코드. 그렇군요. (0) | 2023.01.22 |
[웹앱 디자인] 스프링부트JPA 9. 개발 방식- 앱화면 기초, 템플릿 만들기. -2 (2) | 2023.01.16 |
[웹 프로그래밍] 스프링부트JPA 8. 테이블을 자동생성해보자~. (0) | 2023.01.14 |