Coding 공부/IntelliJ

[IntelliJ_Springboot_MariaDB] Springboot 프로젝트 생성, MariaDB 연결, Springboot Controller 예제, JASON, DAO, DTO

CBJH 2024. 5. 7. 14:03
728x90
반응형

1. DAO, DTO

  1. DAO (Data Access Object): 데이터베이스에 대한 액세스를 캡슐화하고 데이터베이스 작업을 수행하는 객체를 말합니다. DAO는 데이터베이스에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행하는 메소드를 제공하여, 비즈니스 로직과 데이터베이스 간의 연결을 분리하는 역할을 합니다.
  2. 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 데이터는 기본적으로 두 가지 구조를 갖습니다:

  1. 이름/값 쌍의 모음 (자바스크립트의 객체와 유사하고, 다른 언어에서는 보통 딕셔너리, 해시 테이블, 또는 레코드로 구현):
    • JSON 객체는 중괄호 {}로 둘러싸여 있으며, 각 이름(키)은 문자열이고 그 뒤에 콜론 :이 옵니다. 각 이름과 값 쌍은 쉼표 ,로 구분됩니다.
    • 예시: {"name": "John", "age": 30, "city": "New York"}
  2. 값의 정렬된 리스트 (자바스크립트의 배열과 유사하고, 다른 언어에서는 일반적으로 리스트나 배열로 구현):
    • 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 하이퍼 링크는 $ 대신 @를 사용한다.