Sam Park Blog.

Sam의 워드프레스 블로그

Sam Park Blog.

Sam의 워드프레스 블로그

미분류

코딩자율학습 스프링부트3 자바 백엔드 개발 입문 2주차 학습 후기


지난주 스프링 부트 기본 개념과 CRUD(Create/Read) 학습에 이어, 2주차에는 ‘수정(Update)’과 ‘삭제(Delete)’ 기능 구현, 그리고 웹 서비스의 핵심인 REST API를 다루었습니다.




6일차: 게시판 내 페이지 이동하기

6일차는 게시판 내 페이지 이동 방식인 링크와 리다이렉트에 대해 학습했습니다.



링크와 리다이렉트란

링크는 웹 페이지 간 직접 이동 방식이며, 리다이렉트는 서버 지시에 따라 브라우저가 자동으로 다른 페이지로 이동하는 방식입니다. 게시글 등록 후 목록 페이지로 자동 전환 시 리다이렉트가 활용됩니다.

<a href="/articles/new">새 글 작성</a>
<a href="/articles">목록으로 돌아가기</a>



컨트롤러에서 리다이렉트 처리는 다음과 같습니다.

// ArticleController.java
@PostMapping("/articles/create")
public String createArticle(ArticleForm form) {
    Article saved = articleRepository.save(form.toEntity());
    return "redirect:/articles/" + saved.getId();
}


또한, 롬복의 @Getter 어노테이션을 활용하여 코드 간결성을 높였습니다.




7일차: 게시글 수정하기(Update)

CRUD 중 ‘Update’ 기능인 게시글 수정 기능을 구현했습니다.



데이터 수정 과정

게시글 수정은 ‘수정할 데이터 가져오기’, ‘수정 페이지 만들기’, ‘수정 데이터 DB 갱신하기’의 세 단계로 진행됩니다.



수정 페이지로 이동하는 링크와 컨트롤러 처리 예시는 다음과 같습니다.

<!-- show.mustache -->
<a href="/articles/{{article.id}}/edit" class="btn btn-primary">수정</a>


// ArticleController.java
@GetMapping("/articles/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
    model.addAttribute("article", articleRepository.findById(id).orElse(null));
    return "articles/edit";
}



수정 폼(edit.mustache)에서 기존 내용을 표시하고, 제출 시 컨트롤러에서 업데이트를 처리합니다.

<!-- edit.mustache -->
<form class="container" action="/articles/update" method="post">
    <input name="id" type="hidden" value="{{id}}">
    <input type="text" class="form-control" name="title" value="{{article.title}}">
    <textarea class="form-control" name="content">{{article.content}}</textarea>
    <button type="submit" class="btn btn-primary">수정 완료</button>
</form>




articleRepository.save() 메서드는 데이터 존재 여부에 따라 업데이트 또는 신규 생성을 수행합니다.

// ArticleController.java
@PostMapping("/articles/update")
public String update(ArticleForm form) {
    Article articleEntity = form.toEntity();
    if (articleRepository.findById(articleEntity.getId()).orElse(null) != null) {
        articleRepository.save(articleEntity);
    }
    return "redirect:/articles/" + articleEntity.getId();
}




8일차: 게시글 삭제하기(Delete)

CRUD의 마지막 기능인 게시글 삭제를 구현했습니다.



데이터 삭제 과정

삭제는 특정 게시글의 ID를 받아 DB에서 해당 데이터를 제거하는 과정입니다.


삭제 버튼과 컨트롤러 처리 예시는 다음과 같습니다.

<!-- show.mustache -->
<a href="/articles/{{article.id}}/delete" class="btn btn-danger">삭제</a>



RedirectAttributes를 통해 삭제 완료 메시지를 사용자에게 전달합니다.

// ArticleController.java
@GetMapping("/articles/{id}/delete")
public String delete(@PathVariable Long id, RedirectAttributes rttr) {
    Article target = articleRepository.findById(id).orElse(null);
    if (target != null) {
        articleRepository.delete(target);
        rttr.addFlashAttribute("msg", "게시글이 삭제되었습니다!");
    }
    return "redirect:/articles";
}




9일차: CRUD와 SQL 쿼리 종

CRUD 기능 구현 후, DB에서의 실제 동작을 SQL 쿼리 관점에서 분석했습니다.



JPA 로깅 설정 및 SQL 쿼리 확인

application.properties에 로깅 설정을 추가하여 JPA가 실행하는 SQL 쿼리와 매개변수 값을 콘솔에서 확인할 수 있었습니다.

logging.level.org.hibernate.SQL=DEBUG
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE


이를 통해 findById()save()deleteById() 메서드가 실제 SELECTINSERTUPDATEDELETE 쿼리로 변환되는 과정을 이해했습니다.



기본 SQL 쿼리 작성 및 ID 자동 생성

H2 DB 콘솔에서 직접 SQL 쿼리를 실행하며 DB 조작의 기본을 다졌습니다.

SELECT id, name, price FROM coffee WHERE id = 3;
UPDATE coffee SET price = 9900 WHERE id = 4;
DELETE FROM coffee WHERE id = 4;


또한, 엔티티 ID 필드에 @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 사용하여 DB가 ID를 자동으로 생성하도록 설정했습니다.




10일차: REST API와 JSON

2주차 학습의 주요 내용으로 REST API와 JSON에 대해 학습했습니다.



REST API와 JSON의 등장 배경

REST API는 서버 자원을 클라이언트 종류와 관계없이 사용할 수 있는 방법이며, JSON은 웹에서 데이터를 주고받을 때 가장 널리 사용되는 ‘규칙적인 텍스트 형식’입니다. 웹 서비스의 복잡성 증가와 다양한 기기 간의 데이터 통신 요구로 인해 등장했습니다.



REST API 동작 살펴보기

크롬 브라우저의 Talend API Tester 확장 프로그램과 https://jsonplaceholder.typicode.com의 가상 API를 활용하여 REST API의 GETPOSTPATCHDELETE 동작을 실습했습니다. URL과 HTTP 메서드 조합을 통해 CRUD 기능을 RESTful하게 구현하고, key: value 형태의 JSON으로 데이터를 교환하는 방식을 익혔습니다.




2주차 마무리

이번 2주차 스프링 부트 학습을 통해 CRUD 기능 완성도를 높이고, 웹 서비스의 핵심인 REST API와 JSON 통신 방식을 이해했습니다. JPA SQL 로깅을 통한 내부 동작 분석과 API 통신의 중요성을 깨달은 것이 큰 성과였습니다.



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다