스프링 프로젝트 - 카페 만들기

[Spring Boot] 지역별 카페 추천 프로젝트 (1)

한 면만 쓴 종이 2022. 8. 28. 16:59

여행할 때 방문하면 좋을 카페를 추천하는 웹 프로젝트

 

 

📌 기본 설정

 

의존성 추가 항목

 

build.gradle 수정

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'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client'
}

이번 프로젝트에서는 MariaDB를 사용할 것이기 때문에 관련 의존성을 추가해준다.

 

 

📌 데이터베이스 생성

 

cafe 데이터베이스를 생성했다.

이제 cafe를 사용하는 사용자를 만들어야 한다.

아래와 같이 만들었다.

 

그리고 세션 관리자에서 CAFEUSER를 추가해서

아래와 같이 cafe 데이터베이스만 볼 수 있도록 한다.

 

이제 데이터베이스 설정을 spring에서 해주어야 한다.

 

application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:12345/cafe
spring.datasource.username=cafeuser
spring.datasource.password=cafeuser

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

spring.thymeleaf.cache=false

DB관련 정보를 입력

spring.jpa.hibernate.ddl-auto=update: 데이터의 변경된 부분만 업데이트

 

 

📌 시작 화면 만들기

(백엔드 공부를 목적으로 하는 프로젝트이기 때문에 보여지는 화면 부분은 부트스트랩을 이용할 것이다.)

 

Bootstrap 4 Tutorial (w3schools.com)

위 링크에서 코드를 복사해서 붙여넣는다.

 

start.html

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>


</head>
<body>
<div class="jumbotron text-center">
    <h1>☕여행할 때 가면 좋은 카페 추천☕</h1>
    <p>여행하실 곳을 선택해주세요!</p>
</div>

<div class="container">
    <div class="row">
        <div class="col-sm-4">
            <h3>수원</h3>
            <p>몇 개의 카페 추천이 있는지 보여줄 예정</p>
        </div>
        <div class="col-sm-4">
            <h3>강릉</h3>
            <p>몇 개의 카페 추천이 있는지 보여줄 예정</p>
        </div>
        <div class="col-sm-4">
            <h3>제주도</h3>
            <p>몇 개의 카페 추천이 있는지 보여줄 예정</p>
        </div>
    </div>
</div>

</body>
</html>

그리고 현재 만드는 주제에 맞게 수정하고 JS, BootStrap 링크를 추가해준다.

 

 

이제 이 화면을 확인하기 위해 컨트롤러를 만들 것이다.

 

CafeController 클래스

package yeonjy.cafe.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/cafe")

public class CafeController {

    @GetMapping({"/", "/start"})
    public String start() {

        return "/cafe/start";
    }
}

 

이제 http://localhost:8080/cafe/ 를 실행하면 아래와 같은 화면을 볼 수 있다.

이제 직접 입력해서 화면에 보여주는 방식이 아니라 데이터베이스를 활용해서 화면에 띄우도록 수정할 것이다.

 

 

📌 데이터 생성하기

 

아래와 같이 entity 패키지를만들고 Area 클래스를 생성한다. 

package yeonjy.cafe.entity;

import lombok.*;

import javax.persistence.*;


@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Area {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long gno;

    @Column(length = 100, nullable = false)
    private String local;

}

일단 추후에 더 추가하는 것으로 하고 지금은 순번과 지역명만 만들었다.

 

 

이제 AreaRepository 인터페이스를 생성한다.

package yeonjy.cafe.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import yeonjy.cafe.entity.Area;

public interface AreaRepository extends JpaRepository<Area, Long> {

}

이 인터페이스는 JpaRepository 인터페이스를 상속한다.

JpaRepository에는 엔티티의 타입 정보(Area)와 @Id의 타입(Long)을 지정해준다.

 

위에서 JpaRepository를 사용하기 때문에 이를 이용해서 CRUD 작업이 가능하다.

 

테스트 코드를 통해 데이터베이스에 데이터를 save 해보자.

 

package yeonjy.cafe.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import yeonjy.cafe.entity.Area;


@SpringBootTest
public class AreaRepositoryTests {

    @Autowired
    private AreaRepository areaRepository;

    @Test
    public void insertDummies(){

        Area area1 = Area.builder()
                .gno(1L)
                .local("수원")
                .build();
        System.out.println(areaRepository.save(area1));

        Area area2 = Area.builder()
                .gno(2L)
                .local("강릉")
                .build();
        System.out.println(areaRepository.save(area2));


        Area area3 = Area.builder()
                .gno(3L)
                .local("제주도")
                .build();
        System.out.println(areaRepository.save(area3));

    }
}

수원, 강릉, 제주도를 각각 gno를 지정해서 저장해주었다.

 

이제 위 테스트코드를 실행하면 아래와 같이 저장되어있어야 한다.