웹개발의 봄, Spring 강의를 통해 웹의 기본 구조를 배우고 간단한 서비스를 구현
개발부터 배포까지 과정을 경험해보면서 웹서비스의 전체적인 틀을 잡고 싶다.
RDBMS, 줄여서 RDB는 관계형 데이터베이스를 말합니다. 정보 저장소라고 생각하셔도 무방한데요.
가장 대중적으로 사용되는 DBMS이고 모든 데이터를 테이블 형태로 표현하는 관계형 데이터 모델에 기초를 둔 DBMS입니다.
테이블-컬럼형태의 데이터 저장방식을 사용하며 각 열은 특정 종류의 데이터를 수록하며 필드는 속성의 실제 값을 저장합니다.
테이블의 행은 한 객체 또는 엔티티와 관련된 값들의 모음을 나타내며 테이블의 각 행은 기본키로 표시할 수 있고 여러 테이블에 있는행들은 외래키를 사용하여 상호 연결될 수 있습니다.
테이블과 테이블간의 연관관계를 이용하여 필요한 정보를 구하는 방식을 사용합니다.
E-R모델을 사용하여 모델링을 하며 테이블끼리 중복정보는 최소화 시킵니다.
보안,권한 트랜잭션 관리와 같은 기능을 지원합니다.
데이터베이스 트랜잭션들이 안정적으로 수행된다는 것을 보장하기 위한 성질을 가리키는 약어.
Atomicity(원자성)
: 하나의 작업을 수행하기 위해서는 작업을 모두 정상적으로 처리하거나 모두 처리하지 않아야 됨을 뜻합니다.
Consistency(일관성)
: 작업이 수행된 이후에 데이터베이스의 데이터는 모두 일관되어야 합니다.
Isolation(격리성)
: 작업이 수행될 때 다른 작업이 현재 작업을 간섭하면 안됩니다.
Durability(지속성)
: 작업이 성공적으로 이루어진 뒤 데이터는 특정한 경우가 아니면 영구적으로 보존되어야 합니다.
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
그럼, 웹서비스를 만들기 위해 SQL을 모두 배워야할까요? 아닙니다!
우리가 명령을 내린 Java 명령어를 SQL로 번역해주는 녀석이, Spring Data JPA 라는 녀석입니다!
이 녀석이 없었다면 우리는 진짜 필요한 개발을 하는 시간보다
SQL 만드느라 훨씬 많은 시간을 소비했을지 모릅니다.
JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.
Course.java
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course {
@Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
@GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
private Long id;
@Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
private String title;
@Column(nullable = false)
private String tutor;
public String getTitle() {
return this.title;
}
public String getTutor() {
return this.tutor;
}
public Course(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
CourseRepository.java 인터페이스
public interface CourseRepository extends JpaRepository<Course, Long> {
}
spring.jpa.show-sql=true
DB 기본 중의 기본은, "생성일자"와 "수정일자"를 필드로 가지는 것입니다.
Timestamped.java
@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/수정 시간을 자동으로 반영하도록 설정
public abstract class Timestamped {
@CreatedDate // 생성일자임을 나타냅니다.
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 수정일자임을 나타냅니다.
private LocalDateTime modifiedAt;
}
Week02Application.java
@EnableJpaAuditing
@SpringBootApplication
public class Week02Application { ...
Domain에 Timestamped.java 를 extend 시켜준다.
CRUD란? 정보관리의 기본 기능
→ 생성 (Create)
→ 조회 (Read)
→ 변경 (Update)
→ 삭제 (Delete)
Repository의 save
와 findAll
등을 이용합니다.
Update 는 Service 부분에 작성합니다.
CourseService.java
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {
// final: 서비스에게 꼭 필요한 녀석임을 명시
private final CourseRepository courseRepository;
// 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
// 스프링에게 알려줌
public CourseService(CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, CourseRequestDto requestDto) {
Course course1 = courseRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
);
course1.update(requestDto);
return course1.getId();
}
}
Repository의 delete
등을 이용합니다.
테이블을 막 건드려도 될까?
= read, update할 때 Course 클래스를 막 써도 될까?
= 내가 아닌 다른 사람이 변경이라도 한다면?? 😱DTO(Data Transfer Object, 데이터 전송 객체)는 프로세스 간에 데이터를 전달하는 객체이다.
CourseRequestDto.java
@NoArgsConstructor
@Getter
public class CourseRequestDto {
private String title;
private String tutor;
public CourseRequestDto(String title, String tutor) {
this.title = title;
this.tutor = tutor;
}
}
클라이언트 - 서버 간의 약속입니다.
클라이언트가 정한대로 서버에게 요청(Request)을 보내면,
서버가 요구사항을 처리하여 응답(Response)을 반환합니다.
- GET /courses → 강의 전체 목록 조회 요청
- GET /courses/1 → ID가 1번인 녀석 조회 요청
- POST /courses → 강의 생성 요청
- PUT /courses/3 → ID가 3번인 녀석 수정 요청
- DELETE /courses/2 → ID 2번인 녀석 삭제 요청
REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.
REST 기반으로 서비스 API를 구현한 것
자원(Resource): URI
모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URI 다.
Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.
행위(Verb): HTTP Method
HTTP 프로토콜의 Method를 사용한다.
HTTP 프로토콜은 GET, POST, PUT, DELETE 와 같은 메서드를 제공한다.
표현(Representation of Resource)
Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.
JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.
Body데이터를 전송할 때 Content-Type 중요
(POST, PUT 요청 시)
x-www-form-urlencoded
: key-value 값으로 데이터를 전송
text/plain
: text 형태로 데이터 전송
application/json
: json 형태로 데이터를 전송
@RestController
public class Test{
@PostMapping("/body1")
public String xwwwformurlencoded(String username){
return "key=value 전송옴";
}
@PostMapping("/body2")
public String textplain(@RequestBody String data){
return "text/plain 전송옴";
}
@PostMapping("/body3")
public String apllicationjson(@RequestBody data){
return "json 전송옴";
}
}
RDBMS란? - https://csy7792.tistory.com/170
DTO란? - https://kafcamus.tistory.com/13
REST란? - https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html