웹 동작방식 이해하기
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 '합불'
)
'TIL(Develop)' 카테고리의 다른 글
웹/Spring 기초 개념 공부 (1) | 2023.11.01 |
---|---|
첫 실습! HelloWorld GET해오기 with SpringBoot + Postman (1) | 2023.11.01 |
Html 속성 Html Attributes (0) | 2023.09.06 |
HTML 요소 HTML Element (0) | 2023.09.04 |
HTML은 무엇인가? What is HTML? (0) | 2023.09.04 |