Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Spring 입문

by Greedy 2023. 10. 31.

웹 동작방식 이해하기

IP주소 : 네트워크망에서 데스크탑 식별 위치 주소

데이터 송수신 기준 주소

브라우저 : 웹페이지 이미지 비디오등의 컨텐츠를 송수신/ 컨텐츠를 표현

DNS : 도메인 이름을 IP주소로 변환해서 원하는 웹사이트로 중개해줌

HTTP : 웹 상에서 요청을 보내고 받는 상호간의 약속, 형식

API : Application programming interface : 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙

개발자는 다른 애플리케이션이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거나 생성함

클라이언트와 웹 리소스 사이의 게이트웨이

Interface : 서로 다른 두개의 시스템의 경계, 중개

 

RESTful API 

REST : Representational State Transfer(REST) , API 작동방식에 대한 조건을 부과하는 소프트웨어 아키텍쳐

인터넷같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어짐

API 개발자는 여러 아키텍쳐를 사용하여 API를 설계

REST API : REST 아키텍쳐 스타일을 따르는 API

대규모 고성능 통신을 안정적으로 지원할 수 있음

 

~디자인 패턴/ ~ 아키텍쳐로 이미 선배들이 시행착오를 겪은 뒤 만들어 둔 구조를 활용하면 안정성이 높아진다

소프트웨어 디자인 패턴(software design pattern): 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책, 문제 해결 템플릿.

https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html

 

복잡한 문제는 나누자

아키텍쳐적 해결의 가장 선호되는 방법

서버는 세가지로 구성됨

1. 새로운 데이터를 처리하는 부분

2. 서비스 로직을 처리하는 부분

3. 기존의 데이터를 이용하는 부분

레이어드 아키텍처 패턴

출처 : https://jojoldu.tistory.com/603


Presentation 계층

사용자와 상호 작용 처리 계층

CLI, HTTP 요청, HTML 처리 등을 담당한다.

HTTP 요청 처리 및 HTML 렌더링에 대해 알고 있는 웹 계층

흔히 말하는 MVC (Model / View / Controller) 도 이 계층에 속한다.

스프링에서는 @Controller 어노테이션

Domain(Business or Service) 계층

서비스/시스템의 핵심 로직

유효성 검사 및 계산을 포함하는 Business 논리 계층

애플리케이션이 수행해야하는 도메인과 관련된 작업들을 담당한다.

입력/저장된 데이터를 기반으로 계산

Presentation 계층에서 받은 데이터의 유효성 (Validation) 검사

어떤 Data Access 를 선택할지 결정

스프링에서는 @Service 어노테이션

Data Access(Persistence) 계층

DAO 계층

Database / Message Queue / 외부 API와의 통신 등 처리

데이터베이스 또는 원격 서비스에서 영구 데이터를 관리하는 방법을 분류하는 데이터 접근 계층

스프링에서는 @Repository 어노테이션

Controller, Service, Respository 실제 코드들

Controller 예시 코드

@Controller // #1
public class ContentController {

    private final ContentService contentService; // #2

		@GetMapping("/content/{contentId}") // #3
		public Content getContent(@PathVariable Long contentId) { // #4
        Content content = contentService.getContent(requestDto); //#2-1
        return "/contentPage";
    }

    @PostMapping("/content") //#5
		@ResponseBody// #6
    public Content createContent(@RequestBody ContentRequestDto requestDto) {
        Content content = contentService.createContent(requestDto);
        return content;
    }
}

#1 : 이 자바 객체가 컨트롤러 역할을 하는 객체라는 것을 알려주는 어노테이션

#2 : 각각의 레이어는 “일반적으로” 자기와 인접한 레이어와 직접 소통, 이 경우 ContentService객체를 가지고 있어, 컨트롤러 단에서 서비스 단으로 새로 받아온 데이터를 전달하거나 서비스 로직을 호출 할 수 있다. 

#3 : 특정 요청에 호출될 메서드를 지정해주는 어노테이션 

#4 : 자동으로 일치하는 변수값을 메서드 호출되는 시점에 같이 넘겨주는 어노테이션

#5 : #3과 #5가 다른 이유는 HttpMethod에 따라서 다른 Controller 메서드를 연결해줄 수 있기 때문, 같은 주소로 온 GET 요청과 POST을 나눠서 각각 처리

#6 : 두 메서드는 이전에 배웠던, 뷰까지 같이 반환하느냐, 혹은 JSON 형식으로 데이터만 반환하느냐의 차이

 

Service 예시 코드

@Service // #1
public class ContentService {
    private final ContentRepository contentRepository; //#2

    public ReturnDto getContent(Long id) {
        ReturnDto returnDto = contentRepository.findById(id);
        return returnDto; //#3
    }
	
    public Content createContent(ContentRequestDto contentRequestDto) {
		    Content content = new Content(contentRequestDto);
		    contentRepository.save(content);
		    return content;
		}

}

#1 : 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션

#2 : 인접한 계층인 Repository 객체를 가짐

#3 : 인접한 계층으로 데이터를 전달하는 중.

Repository 예시 코드

@Repository
public interface ContentRepository extends JpaRepository<Content, Long> {

}

#1 : 서비스 역할을 하는 객체라는 것을 알려주는 어노테이션

#2 :  SpringDataJpa 의 JpaRepository

 

1. IOC? DI?

private final ContentService contentService; // #2
private final ContentRepository contentRepository; //#2

스프링은 자바 문법과 묘하게 다른 부분이 있다고 함

자바 문법과 다른 부분은 메모를 하고 왜 다른지 알아보다보면

IOC, DI 등 설계 철학 등을 배우고 이해하는데 도움이 된다고 함

스프링/스프링부트는 예전에 불편했던 것들을 획기적으로 편하게 해줘서 스프링 프레임워크를 사용한대

단순 반복작업부분이 많았던 Controller와 Repository쪽을 개발 관점에서 매우 쉽고 편하게 처리해줘 가장 중요한 핵심 비즈니스 로직인 Service 레이어에 더 집중 할 수 있도록 하게 해준다

Database와 SQL

Database

데이터의 집합

 

DBMS

Database Management System

Database를 관리하고 운영하는 소프트웨어

 

RDBMS

Relational DBMS

관계형 데이터베이스

 

테이블(table): 최소 단위, 열(column)과 행(row)으로 구성됨

  • MySQL
  • PostgreSQL
  • Oracle Database

SQL

Structured Query Language

RDBMS에서 사용되는 언어

 

DDL

Data Definition Language

  • CREATE : 새로운 데이터베이스 및 테이블을 생성
CREATE DATABASE 데이터베이스이름;
CREATE TABLE 테이블이름
(
		필드이름1 필드타입1,
    필드이름2 필드타입2,
    ...
);
  • ALTER : 데이터베이스와 테이블의 내용을 수정할 수 있습니다.
ALTER TABLE 테이블이름 ADD 필드이름 필드타입;
ALTER TABLE 테이블이름 DROP 필드이름;
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입;
  • DROP : 데이터베이스와 테이블을 삭제할 수 있습니다. 데이터 및 테이블 전체를 삭제합니다.
DROP DATABASE 데이터베이스이름;
DROP TABLE 테이블이름;
  • TRUNCATE : 데이터베이스와 테이블을 삭제할 수 있습니다. 최초 테이블이 만들어졌던 상태 즉, 컬럼값만 남깁니다.
TRUNCATE DATABASE 데이터베이스이름;
TRUNCATE TABLE 테이블이름;

 

DCL

Data Control Language

GRANT : 사용자 또는 ROLE에 대해 권한을 부여할 수 있습니다.

GRANT [객체권한명] (컬럼)
ON [객체명]
TO { 유저명 | 롤명 | PUBLC} [WITH GRANT OPTION];

//ex
GRANT SELECT ,INSERT 
ON mp
TO scott WITH GRANT OPTION;

REVOKE : 사용자 또는 ROLE에 부여한 권한을 회수할 수 있습니다.

REVOKE { 권한명 [, 권한명...] ALL}
ON 객체명
FROM {유저명 [, 유저명...] | 롤명(ROLE) | PUBLIC} 
[CASCADE CONSTRAINTS];

//ex
REVOKE SELECT , INSERT
ON emp
FROM scott
[CASCADE CONSTRAINTS];

 

DML

Data Manipulation Language

테이블에 데이터를 검색, 삽입, 수정, 삭제

INSERT : 테이블에 새로운 row를 추가할 수 있습니다.

INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...) 
VALUES(데이터값1, 데이터값2, 데이터값3, ...);
INSERT INTO 테이블이름 
VALUES(데이터값1, 데이터값2, 데이터값3, ...);

SELECT : 테이블의 row를 선택할 수 있습니다.

SELECT 필드이름 FROM 테이블이름 [WHERE 조건];

UPDATE : 테이블의 row의 내용을 수정할 수 있습니다.

UPDATE 테이블이름 
SET 필드이름1=데이터값1, 필드이름2=데이터값2, ... 
WHERE 필드이름=데이터값;

DELETE : 테이블의 row를 삭제할 수 있습니다.

DELETE FROM 테이블이름 WHERE 필드이름=데이터값;

 

SQL연습하기

CREATE

제약조건

AUTO_INCREMENT : 컬럼의 값이 중복되지 않게 1씩 자동으로 증가하게 해줘 고유번호를 생성해 줍니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 AUTO_INCREMENT,
    // id bigint AUTO_INCREMENT,
    ...
);

NOT NULL : 해당 필드는 NULL 값을 저장할 수 없게 됩니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 NOT NULL,
    ...
);

UNIQUE : 해당 필드는 서로 다른 값을 가져야만 합니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 UNIQUE,
    ...
);

PRIMARY KEY : 해당 필드가 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가지게 됩니다.

CREATE TABLE 테이블이름
(
    필드이름 필드타입 PRIMARY KEY,
    ...
);

 

  • PRIMARY KEY 기본키 : 테이블 내에서 '유일하게 존재하는 값의 조합'을 설정해서 중복된 데이터가 테이블에 삽입되는 것을 방지하는 제약조건

1️⃣ 데이터의 중복을 방지

2️⃣ 데이터를 매우 빠르게 찾을 수 있음

기본키를 설정하면 DBMS는 인덱스를 만듦

인덱스로 탐색시 데이터를 빨리 찾을 수 있다

컬럼에 기본키가 설정되어있지 않으면 중복될 수 없다는 것을 DBMS가 몰라서 모든 row를 모두 확인함

기본키가 설정되어있으면 row를 전부 확인하지 않고 1개만 찾으면 바로 리턴함

 

FOREIGN KEY : 하나의 테이블을 다른 테이블에 의존하게 만들며 데이터의 무결성을 보장

  • FK 를 가지는 테이블이 참조하는 기준 테이블의 열은 반드시 PK, UNIQUE 제약조건이 설정되어 있어야 함
CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...
		FOREIGN KEY(필드이름)
    REFERENCES 테이블이름(필드이름)
);
  • 외래키는 두개의 테이블을 연결하는 다리 역할을 해주는 키

 

<회원주문 테이블>

회원_id 회원_이름 주문_id 상품_이름 상품_수량

u_1 userA o_1 item_1 5
u_1 userA o_2 item_2 3
u_1 userA o_3 item_1 10
u_2 userB o_4 item_3 7
u_2 userB o_5 item_2 3
  • 중복된 데이터
  • 2개로 테이블 분리해봄

<회원 테이블>

회원_id 회원_이름

u_1 userA
u_2 userB

<주문 테이블>

주문_id 상품_이름 상품_수량

o_1 item_1 5
o_2 item_2 3
o_3 item_1 10
o_4 item_3 7
o_5 item_2 3
  • 이러면 중복된 데이터는 없어지지만 어느 사용자가 무슨 주문을 했는지를 알 수 없게 됨
  • 외래키를 사용하여 해결

<회원 테이블>

회원_id 회원_이름

u_1 userA
u_2 userB

<주문 테이블>

주문_id 상품_이름 상품_수량 회원_id

o_1 item_1 5 u_1
o_2 item_2 3 u_1
o_3 item_1 10 u_1
o_4 item_3 7 u_2
o_5 item_2 3 u_2
  • 중복되는 데이터를 없애고 주문 테이블에서 외래키를 사용해서 사용자테이블에 접근해 주문을 한 사용자의 정보도 가져옴
  • 외래키도 중복 데이터 삽입을 방지하는 역할을 수행
  • 외래키는 데이터가 새롭게 추가될 때 외래키에 해당하는 값이 외래키가 참조하는 테이블에 존재하는지를 확인

CASCADE : FOREIGN KEY 로 연관된 데이터를 삭제,변경할 수 있습니다.

STUDENT 테이블

  • MySQL
CREATE TABLE IF NOT EXISTS STUDENT
(
	student_code varchar(100) primary key comment '수강생코드', 
	name varchar(100) not null comment '이름',
	birth varchar(8) null comment '생년월일',
	gender varchar(1) not null comment '성별',
	phone varchar(11) null comment '전화번호',
	major_code varchar(100) not null comment '주특기코드',
	foreign key(major_code) references major(major_code)
)
COMMENT '수강생정보' charset=utf8;
  • H2
CREATE TABLE IF NOT EXISTS STUDENT
(
	student_code varchar(100) primary key comment '수강생코드', 
	name varchar(100) not null comment '이름',
	birth varchar(8) null comment '생년월일',
	gender varchar(1) not null comment '성별',
	phone varchar(11) null comment '전화번호',
	major_code varchar(100) not null comment '주특기코드',
	foreign key(major_code) references major(major_code)
)

EXAM 테이블

  • MySQL
CREATE TABLE IF NOT EXISTS EXAM
(
	student_code varchar(100) not null comment '수강생코드', 
	exam_seq int not null comment '시험주차', 
	score decimal(10,2) not null comment '시험점수',
	result varchar(1) not null comment '합불'
)
COMMENT '시험성적' charset=utf8;
  • H2
CREATE TABLE IF NOT EXISTS EXAM
(
	student_code varchar(100) not null comment '수강생코드', 
	exam_seq int not null comment '시험주차', 
	score decimal(10,2) not null comment '시험점수',
	result varchar(1) not null comment '합불'
)