[스파르타코딩클럽] 웹개발의 봄, Spring 2주차

MOON·2021년 8월 30일
0
post-thumbnail

웹개발의 봄, Spring 2주차

💡기대하는 것

웹개발의 봄, Spring 강의를 통해 웹의 기본 구조를 배우고 간단한 서비스를 구현
개발부터 배포까지 과정을 경험해보면서 웹서비스의 전체적인 틀을 잡고 싶다.

📝배운것

  • 서비스 전체 흐름
  • RDBMS 기초 지식
  • Timestamped 추상클래스 상속하기
  • Spring Data JPA로 CRUD 구현
  • Controller, Service, Repository
  • API, Lombok, Dto

✏️RDBMS란?

RDBMS, 줄여서 RDB는 관계형 데이터베이스를 말합니다. 정보 저장소라고 생각하셔도 무방한데요.

특징

가장 대중적으로 사용되는 DBMS이고 모든 데이터를 테이블 형태로 표현하는 관계형 데이터 모델에 기초를 둔 DBMS입니다.

테이블-컬럼형태의 데이터 저장방식을 사용하며 각 열은 특정 종류의 데이터를 수록하며 필드는 속성의 실제 값을 저장합니다.

테이블의 행은 한 객체 또는 엔티티와 관련된 값들의 모음을 나타내며 테이블의 각 행은 기본키로 표시할 수 있고 여러 테이블에 있는행들은 외래키를 사용하여 상호 연결될 수 있습니다.

테이블과 테이블간의 연관관계를 이용하여 필요한 정보를 구하는 방식을 사용합니다.

E-R모델을 사용하여 모델링을 하며 테이블끼리 중복정보는 최소화 시킵니다.

보안,권한 트랜잭션 관리와 같은 기능을 지원합니다.

  • H2는 RDBMS의 한 종류로, 서버가 켜져있는 동안에만 작동하는 RDB입니다.
  • SQL은 데이터를 읽고, 저장하고, 변경하고, 삭제하는 구체적인 문법입니다.

ACID

데이터베이스 트랜잭션들이 안정적으로 수행된다는 것을 보장하기 위한 성질을 가리키는 약어.

Atomicity(원자성) : 하나의 작업을 수행하기 위해서는 작업을 모두 정상적으로 처리하거나 모두 처리하지 않아야 됨을 뜻합니다.

Consistency(일관성) : 작업이 수행된 이후에 데이터베이스의 데이터는 모두 일관되어야 합니다.

Isolation(격리성) : 작업이 수행될 때 다른 작업이 현재 작업을 간섭하면 안됩니다.

Durability(지속성) : 작업이 성공적으로 이루어진 뒤 데이터는 특정한 경우가 아니면 영구적으로 보존되어야 합니다.

application.properties -> H2 웹콘솔 설정

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb

그럼, 웹서비스를 만들기 위해 SQL을 모두 배워야할까요? 아닙니다!

우리가 명령을 내린 Java 명령어를 SQL로 번역해주는 녀석이, Spring Data JPA 라는 녀석입니다!

이 녀석이 없었다면 우리는 진짜 필요한 개발을 하는 시간보다
SQL 만드느라 훨씬 많은 시간을 소비했을지 모릅니다.

✏️JPA란?

JPA는, SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기입니다.

Domain, Repository

  • 자바로 DB를 사용하도록 도와주는 녀석이 JPA 라고 말씀드렸습니다.
  • 그럼 DB를 이용하는데 핵심이었던 "테이블"과 "SQL"과 동일한 개념의 자바 용어가 있겠죠?
  • "테이블"은 Domain, "SQL"은 Repository 입니다.

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> {
}

application.properties -> SQL이 보이도록 설정

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 시켜준다.

✏️JPA를 이용해서 CRUD 구현

CRUD란? 정보관리의 기본 기능
→ 생성 (Create)
→ 조회 (Read)
→ 변경 (Update)
→ 삭제 (Delete)

데이터 저장하기 (Create) & 조회하기 (Read)

Repository의 savefindAll 등을 이용합니다.

데이터 변경하기 (Update)

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();
    }
}

데이터 삭제하기 (Delete)

Repository의 delete 등을 이용합니다.

✏️DTO란?

테이블을 막 건드려도 될까?
= 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;
    }
}

데이터를 전달할 때 Entity 혹은 VO 대신 DTO를 사용하는 이유

  • 외부와 통신하는 프로그램에게 있어 호출은 큰 비용이며, 이를 줄이고 더욱 효율적으로 값을 전달할 필요가 있다.
  • 이를 위해 데이터를 모아 한번에 전달하는 방법이 고안되었다. 이때 이 클래스를 DTO라고 한다.
  • 각 레이어 간 역할을 분리할 수 있기 때문이다.

✏️API란?

클라이언트 - 서버 간의 약속입니다.

클라이언트가 정한대로 서버에게 요청(Request)을 보내면,
서버가 요구사항을 처리하여 응답(Response)을 반환합니다.

예시

- GET /courses    	 → 강의 전체 목록 조회 요청
- GET /courses/1  	 → ID가 1번인 녀석 조회 요청
- POST /courses   	 → 강의 생성 요청
- PUT /courses/3  	 → ID가 3번인 녀석 수정 요청
- DELETE /courses/2      → ID 2번인 녀석 삭제 요청

REST

REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.

REST API란?

REST 기반으로 서비스 API를 구현한 것

REST 구성 요소

  • 자원(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를 통해 데이터를 주고 받는 것이 일반적이다.

HTTP Header

  • Content-Type 이해
    스프링부트는 기본적으로 x-www-form-urlencoded 타입을 파싱해준다.

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

0개의 댓글