Spring Boot와 데이터베이스 설정

gyeorrr·2024년 8월 13일

Spring Boot

웹사이트를 만들 수 있게 도와주는 프레임워크다

프레임워크?

개발자가 좀 더 편하도록 알고리즘들을 메소드로 만든 툴 같은 것

Di(의존성 주입) ? 메소드를 만들 때 매개를 필요로하는 것 → 결합도를 낮춘다
즉, 어떠한 메소드가 동작할 때 외부에서 값을 주입해주는 것

원하는 값이 나오려면 , 이미 만들어진 틀(양식),폼에 맞춰서 작성을 해야한다
이를 제어의 역전(IOC)이라고한다

우리는 지금까지 객체를 생성하고 결정하는 등 모든것을 사용자가 직접 제어했다

스프링 프레임워크는 만들어진 규칙이 있으며 우리는 거기에 맞춰야한다

스프링 프레임워크 안에 있는 라이브러리들을 이용하여 개발한 것이
SpringBoot인것임


웹계층 (Layer)

Presentation Layer (Controller)

요청을 받아서 보여준다
Controller , CMRespDto

Business Layer (Service)

모든 로직처리를 한다
Interface , Implements , RequestDto , ResponseDto

Data Access Layer(Repository)

DB와 연관이 있으며 , ServiceLyaer에서 받은 가공된 데이터를 자리에 맞게 분배해주거나 , 요청한 데이터를 꺼내준다
이것을 CRUD라고 부른다.

Repository , XML,
AWS(mariaDB), mybatis(프레임워크)

웹에서 이루어지는 동작들


요청(HTTP)날라옴 (header에는 필수정보들(메소드,URL,서버IP,Port) / body 데이터 들고감) → 디스패쳐서블릿 호출(안에서 핸들러매핑 호출) → url과 메소드가 뭔지 찾는다 → 찾으면 디스패쳐한테 리턴해주고 디스패쳐가 해당메소드 호출 → 로직처리가 되고 디스패처한테 다시 리턴
이 때 컨트롤러의 성질에 따라서 ViewResolver를 들릴지 말지 정해짐 안 들리면 json으로 리턴


각 파일들 역할 정리

Controller

@Controller / @RestController

컨트롤러에서 사용되는 택 1 어노테이션으로 ,
Controller : return 값으로 html에 접근하게 되며 주로 화면을 보여줄 때 사용된다

RestController : return 값으로 데이터 동신할 때 사용 됨

기존 @Controller에 @ResponseBody가 추가된 것이며
Json형태로 된 데이터 객체를 반환 받아 주로 데이터 교환을 목적으로 사용된다

그래서 동작과정 역시 기본 컨트롤러에 @ResponseBody를 붙인것과 같음

컨트롤러 두개를 보여주는 곳(Controller(view)) , 데이터 교환(RestController)이 이루어지는 곳으로 분류하여 만들자

PageController / apiController


@RequestMapping ("/주소")

특정 url를 고정적으로 사용하는 것

사용하는 이유 : 카테고리를 나눌 때 일일히 쓰는것도 번거롭고 , 구분감을 확실하게 하기위해서 사용한다

@Getmapping (Read)
주로 데이터를 가져오거나 , 읽는용도로 사용 한다

@RequestParam

@GetMapping에서 매개변수를 넣으면 기본적으로 사용되며,
웹에서 받은 데이터를 변수로 활용하기위해서 사용 됨
받을 때 자료형과 키값 = 변수 맞춰주면 알아서 들어감

웹에서 받고자하는 값이 많을 때 header에 Param이라는 객체에 key value형태로 보내면
dto로 받을 수 있다.

@PathVariable

@Getmapping으로 데이터를 조회(요청)할건데, 주소값안에 변수를 보낼 때

그 변수를 활용하려는 경우 @PathVariable을 통해서,

변수를 컨트롤러로 가져올 수 있음
@RequestParam과 달리 받는 변수가 하나거나 적을 때 Param보다 자주 사용됨

페이징처리,페이지 이동할 때 많이 사용된다


@PostMapping
데이터를 db에 보내서 저장할 때 주로 사용한다

웹에서 객체로 된 값을 dto로 받을 때 사용됨 이 때 매개변수에는 @RequestBody 명시해주어야한다

@ResponseBody

데이터값만 반환할 때 사용 된다
화면을 보여주는 게 아니라 데이터만 필요할 때 주로 사용하며
ViewResolver를 들리지않는다

JSON형태로 리턴해줌 → 객체 { key : value} 형태


Service

interface , implements가 존재

모든 로직을 처리하는 구간이다

컨트롤러에서 데이터를 받아서 Repository로 전달하는 일종의 허브 같은 곳

RequestDto,ResponseDto,Repository 전부 여길 오고간다

@Service
여기가 서비스레이어 라는 곳임을 선언하는 어노테이션

@RequiredArgsConstructor
DI (의존성 주입) 유일한 객체로 만들어 공유시킨다
(Repository)인터페이스를 final 변수로 선언하여 오로지 서비스클래스에서만 이용

또는 사용하고자 하는 Controller 에서 @AutoWired로 연결 해준다
(IOC컨테이너에 미리 생성됨으로써 하나의 생성자로 의존성주입시켜준거임)

RequestDto
클라이언트에게 데이터를 key value로 받아서 저장
정보는 컨트롤러에 전달되기 전 dispatcherServlet?

ResponseDto
DB에서 데이터를 key value 로 받아서 저장

CMResponseDto
데이터를 받아서 마지막으로 꾸며서 클라이언트에게 보여지는 걸 만들어주는 곳

Dto ?

Data Transfer Object

계층간 데이터 교환을 위해 로직을 가지지 않은(수정이 안되는 클래스)
순수한 데이터 객체 (Getter & Setter)만 가진 클래스

보낼 데이터가 많아지면 일일히 변수를만들어 작성하기 힘들다
데이터를 하나의 객체(Dto)로 만들어 Entity에 데이터를 보내준다.

dto 클래스는 private로 외부에서 접근이 불가능하게끔 만들어 보안성을 높이는데,

이 때 캡슐화 때문에 외부에서 데이터 접근이 불가하다

그래서 @Data 어노테이션이 필요하다


캡슐화 ( private가 붙은 건 해당클래스에서만 사용 가능 )

@Data getter,setter,toString 사용을 위한 어노테이션


Repository

Board,MapperInterface, xml

@Mapper
xml로 데이터를 보내줄 인터페이스라는 위치를 칭하는 어노테이션

XML ?

MyBatis 라이브러리를 사용해 좀 더 쉽게 DB통신을 하기위한 도구라고보면 됨
그래서 XML은 데이터를 SQL query 형식으로 정리해줄건데 그것을 적는 공간
레포지토리(@mapper어노테이션이 달려있는 곳)에서 값을 받아서 db공간 까지 접근하는 곳이다

DAO

Data Access Object의 줄임말인 DAO는 프로젝트와 데이터베이스를 연결한다. Mapper에 SQL을 명시한뒤 Mapper와 함께 데이터베이스와 데이터를 주고받는다.

Entity

db에 들어갈 모든 변수들이 존재할 곳
@builder
@NoArgsConstructor
@AllArgsConstructor
@Data

toRespDto
Entity에서 view를 하는 건 안된다는 원칙
그래서 자료형을 바꿔주는 builder메소드


YML, SQL , myBatis 기본 세팅

AWS

데이터베이스의 공간을 부여해주는 클라우드이며, 사용하려면 초기설정이 필요하다

데이터베이스 생성 RDS
데이터베이스 생성 들어와서 딴 건 건들지말고 언급되는 것만 설정할 것

엔진옵션 - MariaDB 선택
엔진버전 : MariaDB 10.6.10
템플릿 - 프리티어

설정
DB 인스턴스 식별자 : db-identifier-gyeolhwi (마음대로 설정)
자격 증명 설정
마스터 사용자이름 : id랑 같은 개념 admin
마스터암호 : 유출되면 안됨 







파라미터 그룹 생성

인스턴스 식별자와 맟춰주기

수정 가능한 파라미터

  • 지역시간설정 time_zone = Asia_Seoul
  • 문자인코딩 character_set
    [ client, connection, database, filesystem, results, server ] = utf8mb4
  • collation_(connection, server) = utf8mb4_general_ci
  • 연결가능횟수 max_connections = 1500
  • 트리거 권한 log_bin_trust_function_creators = 1

MySQL 파라미터그룹

time_zone → Asia/seoul
character_set_~ → utf8mb4
collation → utf8mb4_0900_ai_ci / 제너럴ci?
// 프로시저,트리거 생성 해주는 거
log_bin_trust_function_creators → 1

대시보드 - 리소스(DB인스턴스)

체크 - 수정- 데이터베스옵션에서 DB파라미터그룹 변경
계속
수정예약 - 즉시적용

상태 수정 중 → 사용가능 확인 후 DB식별자 이름 클릭

연결 및 보안 - 보안

연결 및 보안 - 보안
VPC 보안 그룹 default~ 클릭 - 보안그룹 ID 클릭 - 인바운드 규칙 편집 - 규칙추가


SQL

aws에서 엔드포인트 복사하기

sql 호스트명/IP에 붙여넣기
사용자 , 암호 → aws에서 설정한 id,pw

맥의 경우 sequel pro 다운로드
+SQL은 해킹을 많이 받으니까 table 같은 거 따로 저장해두기
(query문도 작성해놓으면 좋겠다)


MyBatis

MVN 사이트(그래들)

  • MariaDB Java Client
  • mybatis spring boot Starter version 3.0.1

YML 설정(자동완성으로 쓰기)

* spring.mvc.static-path-pattern /static/**
* datasource.driver-class-name 
org.mariadb.jdbc.Driver 
url , username , password 

url : jdbc:mariadb:// 엔드포인트 링크:포트번호/데이터베이스명?/useUnicode=true&characterEncoding=UTF-8  

username : 내가지정한 거 ex) admin 
password : aws에서 지정한 비밀번호

* mybatis.mapper-locations
/mappers/*.xml

예시

XML 작성하기

mapper 레포지토리 경로 작성 (받을 곳)

ex) BoardRepository (인터페이스) 경로 그대로 가져오기

리소스에 mappers 패키지 생성

마이바티스 검색 → 시작하기 → 독타입 복사

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace ="레포지토리경로"> ex)com. ~ Repository
  
    <select id="findByUserCode" parameterType="Integer"
            resultType="데이터가 저장될 경로">
        SELECT
      
        FROM
      
        where
      
    </select>
  
</mapper>

parameterType 경로 ( 레포지토리로 보내주는 곳 )
레포지토리에서 매개변수의 자료형이 어떤거냐에 따라서 잡아주면된다
resulttype의 경우 → 리턴 자료형 잡아주면 됨


aqua
coral
title

0개의 댓글