Coding 공부/IntelliJ
[IntelliJ_Springboot_MariaDB] Springboot 프로젝트 생성, MariaDB 연결, Springboot Controller 예제, JASON, DAO, DTO
CBJH
2024. 5. 7. 14:03
728x90
반응형
1. DAO, DTO
- DAO (Data Access Object): 데이터베이스에 대한 액세스를 캡슐화하고 데이터베이스 작업을 수행하는 객체를 말합니다. DAO는 데이터베이스에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행하는 메소드를 제공하여, 비즈니스 로직과 데이터베이스 간의 연결을 분리하는 역할을 합니다.
- DTO (Data Transfer Object): 데이터 전송 객체로, 계층 간 데이터를 전달하는 데 사용되는 객체입니다. DTO는 특히 분산 시스템이나 웹 서비스에서 데이터를 효율적으로 전송하기 위해 사용되며, 비즈니스 로직을 포함하지 않고 순수하게 데이터를 담고 있습니다.
2. Springboot 프로젝트 만들기
- 망치버튼(build)를 누르면 앞서 체크 했던 dependencies들이 설치된다.
- appication properties에서 톰캣 포트번호나 인코딩 설정 같은 기본 설정을 할 수 있다.
- 마리아db 연결 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3309/webdb
spring.datasource.username=webUser
spring.datasource.password=webuser
spring.jpa.hibernate.ddl-auto=update
- sql 사용시 자료에 바뀐 부분이 있으면 update, 없으면 새로 생성하겠다.
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
- 로그에 보여주는 sql 쿼리를 보기 쉽게 포매팅 해주는 옵션
- sql 쿼리를 콘솔에 출력해주는 옵션
- MariaDB연결 방법
- User, Password, Database는 본인이 설정한대로 입력해준다.
- Port는 MariaDB 연습할 때 3309로 바꿔서 했으므로 수정했다.
- lombok을 테스트 환경에서 사용할 수 있는 코드 2줄 추가
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
- 또는 build.gradle에 해당 코드를 복사해 붙여넣기한다.
buildscript {
ext{
queryDslVersion = "5.0.0"
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.5'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'org.zerock'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
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'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
// https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.0.0'
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
annotationProcessor(
"jakarta.persistence:jakarta.persistence-api",
"jakarta.annotation:jakarta.annotation-api",
"com.querydsl:querydsl-apt:${queryDslVersion}:jakarta"
)
}
tasks.named('test') {
useJUnitPlatform()
}
compileJava.dependsOn('clean')
- dependencies를 추가하면 코끼리 아이콘을 클릭해 적용해준다.
3. jason
JSON 데이터는 기본적으로 두 가지 구조를 갖습니다:
- 이름/값 쌍의 모음 (자바스크립트의 객체와 유사하고, 다른 언어에서는 보통 딕셔너리, 해시 테이블, 또는 레코드로 구현):
- JSON 객체는 중괄호 {}로 둘러싸여 있으며, 각 이름(키)은 문자열이고 그 뒤에 콜론 :이 옵니다. 각 이름과 값 쌍은 쉼표 ,로 구분됩니다.
- 예시: {"name": "John", "age": 30, "city": "New York"}
- 값의 정렬된 리스트 (자바스크립트의 배열과 유사하고, 다른 언어에서는 일반적으로 리스트나 배열로 구현):
- JSON 배열은 대괄호 []로 둘러싸여 있으며, 값은 쉼표 ,로 구분됩니다.
- 예시: ["apple", "banana", "cherry"]
JSON 포맷에서 사용할 수 있는 값의 유형은 다음과 같습니다:
- 문자열 (큰따옴표로 둘러싸인 텍스트)
- 숫자 (정수 또는 실수)
- 객체 (중괄호로 둘러싸인 이름/값 쌍의 모음)
- 배열 (대괄호로 둘러싸인 값의 리스트)
- 참/거짓 값 (true 또는 false)
- null
4. Springboot Controller 예제
@Controller
@Log4j2
public class SampleController {
class SampleDTO{
private String p1, p2, p3;
public String getP1(){return p1;}
public String getP2(){return p2;}
public String getP3(){return p3;}
}
@GetMapping("/ex/ex2")
public void ex2(Model model){
List<String> strList = IntStream.range(1,10).mapToObj(i->"STR"+i).collect(Collectors.toList());
model.addAttribute("strList", strList);
Map<String, String> map = new HashMap<>();
map.put("A", "AAAAAA");
map.put("B", "BBBBBB");
model.addAttribute("map", map);
SampleDTO sampleDTO = new SampleDTO();
sampleDTO.p1 = "p1p1p1p1p1p1";
sampleDTO.p2 = "p2p2p2p2p2p2p2p2p22";
sampleDTO.p3 = "p3p3p3p3p3p3p3";
model.addAttribute("sampleDTO", sampleDTO);
}
@GetMapping("/hello")
public void hello(Model model){
log.info("hello...........");
model.addAttribute("msg", "Hello World");
}
@GetMapping("/ex/ex1")
public void ex1(Model model){
List<String> list = Arrays.asList("111","CCC", "dd");
model.addAttribute("list", list);
}
@GetMapping("/ex/ex01")
public void ex01(Model model){
List<SampleDTO01> DTOList = IntStream.rangeClosed(1,40).asLongStream().mapToObj(i->{
SampleDTO01 dto = SampleDTO01.builder()
.id(i)
.name("사용자"+i)
.contents("Content......" + i)
.regTime(LocalDateTime.now())
.build();
return dto;
}).collect(Collectors.toList());
System.out.println(DTOList);
model.addAttribute("DTOList", DTOList);
}
@GetMapping("/layout/layout1")
public void layout1(Model model){}
@GetMapping("/ex/ex3")
public void ex3(Model model){
model.addAttribute("arr", new String[]{"aaa","bbb","ccc"});
}
@GetMapping("/memInsert")
public void memInsert(Model model){}
@PostMapping("/memInsert")
public String memInsert(@ModelAttribute MemberDTO memberDTO, Model model){
String info = memberDTO.getName() +", " + memberDTO.getEmail() + ", " + memberDTO.getAge();
model.addAttribute("info", info);
return "result";
}
@Autowired
private BoardRepository boardRepository;
@GetMapping("/ex/ex02")
public String list(@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "size", defaultValue = "10") int size,
Model model) {
Pageable pageable = PageRequest.of(page, size, Sort.by("bno").descending());
Page<Board> boardPage = boardRepository.findAll(pageable);
model.addAttribute("boards", boardPage.getContent());
model.addAttribute("totalPages", boardPage.getTotalPages());
model.addAttribute("currentPage", page);
return "ex/ex02";
}
}
//JSON 컨트롤러
@RestController
@Log4j2
public class SampleJASONController {
@GetMapping("helloJSON")
public String[] helloJSON1234(){
return new String[]{"aaa", "bbb", "ccc"};
}
}
- Servlet과 차이점 : 컨트롤러 어노테이션으로 @Controller(일반적인 컨트롤러), @RestController(제이슨 컨트롤러)를 사용한다.
- 함수명에 doGet을 사용하지 않고 함수명은 자유롭게 할 수 있다.
- url은 templates 폴더의 html 파일명과 일치하게 만들어준다.
- Model model을 매개변수로 받아서 model.addAtrribute 메서드로 html에 값을 전달 할 수 있다.(서블릿의 request.setAttribute와 비슷하다)
<!--hello.html-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text = "${msg}"></h1>
</body>
</html>
<!--ex1.html-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:with="num1=${10}, num2=${20}">
<h4 th:text="${num1+num2}"></h4>
</div>
<div th:each="item : ${list}">
<h1 th:text="${item}"></h1>
</div>
<ul>
<li th:each="str: ${list}" th:text="${str}"></li>
</ul>
<ul>
<th:block th:each="str: ${list}">
<li>[[${str}]]</li>
</th:block>
</ul>
<h1 th:text ="${list}"> </h1>
<a th:href="@{/hello}">go to hello</a>
<a th:href="@{/hello(name='홍길동', age=999)}">go to hello</a>
</body>
</html>
- Springboot는 thymeleaf를 사용해서 값을 전달 받아 읽어 올 수 있다.
- 변수는 쌍 따옴표 안에 입력한다.
- 값은 "${}"로 표현한다.
- 반복문은 each를 사용한다.
- th:each 반복문, th:text 텍스트로 출력한다. th:href 하이퍼링크로 출력한다.
- th:href 하이퍼 링크는 $ 대신 @를 사용한다.