자율학습단 스프링부트 2주차

하파타카·2023년 9월 4일
0

6일차

게시판 내 페이지이동

a태그를 이용해 간단하게 페이지끼리 이동하는 기능 추가.
페이지네이션 아님.

@PostMapping("/articles/create")
public String createAricle(ArticleForm form) {
    log.info(form.toString());
    // 1. DTO를 entity로 변환
    Article article = form.toEntity();
    System.out.println(article.toString());

    // 2. repository로 entity를 DB에 저장
    Article saved = articleRepository.save(article);
    log.info(saved.toString());
    return "redirect:/articles/" + saved.getId();
}

게시글 작성 후 redirect로 방금 작성한 글의 id로 글의 상세페이로 넘어갈때 사용하기위해 Article Entity클래스에 @Getter를 추가한다.


7일차

게시글 수정 - update

PUT과-PATCH-차이
책에서는 post로 보내지만 put과 patch중 어떤게 맞는지 위의 링크를 보며 먼저 생각해봄.

@GetMapping("/articles/{id}/edit")
public String edit(@PathVariable Long id, Model m) {
    Article articleEntity = articleRepository.findById(id).orElse(null);
    m.addAttribute("article", articleEntity);
    return "articles/edit";
}

@PostMapping("/articles/update")
public String edit(ArticleForm dto, Model m) {
    // 1. DTO를 Entity로 변환
    log.info(dto.toString());
    Article article = dto.toEntity();
    // 2. Entity를 DB에 저장
    // 2-1. DB에서 기존데이터 가져오기
    Article target = articleRepository.findById(article.getId()).orElse(null);
    // 2-2. 데이터 값 갱신하기
    if (target != null) {
        articleRepository.save(article);
    }
    // 3. 수정결과 페이지로 리다이렉트
    return "redirect:/articles/" + article.getId();
}
{{>layouts/header}}

{{#article}}
<form action="/articles/update" method="post" class="container">
    <input name="id" type="text" value="{{id}}">
    <div class="mb-3">
        <label class="form-label">제목</label>
        <input type="text" class="form-control" name="title" value="{{title}}">
    </div>
    <div class="mb-3">
        <label class="form-label">내용</label>
        <textarea class="form-control" rows="3" name="content" placeholder="내용을 입력하세요.">{{content}}</textarea>
    </div>
    <button type="reset" class="btn btn-danger">Reset</button>
    <button type="submit" class="btn btn-primary">Submit</button>
    <a href="/articles/{{id}}">Back</a>
</form>
{{/article}}

{{>layouts/footer}}

8일차

게시글 삭제 - delete

- ArticleConroller -

@PostMapping("/articles/update")
public String edit(ArticleForm dto) {
    // 1. DTO를 Entity로 변환
    log.info(dto.toString());
    Article article = dto.toEntity();
    // 2. Entity를 DB에 저장
    // 2-1. DB에서 기존데이터 가져오기
    Article target = articleRepository.findById(article.getId()).orElse(null);
    // 2-2. 데이터 값 갱신하기
    if (target != null) {
        articleRepository.save(article);
    }
    // 3. 수정결과 페이지로 리다이렉트
    return "redirect:/articles/" + article.getId();
}

@GetMapping("/articles/{id}/delete")
public String delete(@PathVariable Long id, RedirectAttributes rttr) {
    log.info("삭제 요청을 받았습니다.");
    // 1. 삭제할 대상 가져오기
    Article target = articleRepository.findById(id).orElse(null);
    // 2. 대상 entity 삭제하기
    if (target != null) {
        articleRepository.delete(target);
        rttr.addFlashAttribute("msg", "삭제되었습니다.");
    }
    // 3. 결과 페이지로 리다이렉트
    return "redirect:/articles";
}

- show.mustache -

<div class="p-5">
    {{#article}}
        <p>{{id}}</p>
        <h4>{{title}}</h4>
        <p>{{content}}</p>
    {{/article}}
    <a href="/articles/{{article.id}}/edit" class="btn btn-primary">Edit</a>
    <a href="/articles/{{article.id}}/delete" class="btn btn-danger">Delete</a>
    <a href="/articles">Go to Articles List</a>
</div>

delete버튼용 a태그 추가

- edit.mustache -

{{#article}}
<form action="/articles/update" method="post" class="container">
    <input name="id" type="hidden" value="{{id}}">
    <div class="mb-3">
        <label class="form-label">제목</label>
        <input type="text" class="form-control" name="title" value="{{title}}">
    </div>
    <div class="mb-3">
        <label class="form-label">내용</label>
        <textarea class="form-control" rows="3" name="content" placeholder="내용을 입력하세요.">{{content}}</textarea>
    </div>
    <button type="reset" class="btn btn-danger">Reset</button>
    <button type="submit" class="btn btn-primary">Submit</button>
    <a href="/articles/{{id}}">Back</a>
</form>
{{/article}}

상하단의 {{>layouts/header}}{{>layouts/footer}}는 생략.


9일차

JPA 로깅

3일차에서 구글링 후 적용해둔 로깅에 대한 설명파트.

- application.properties -

# 디버그 레벨로 쿼리 출력
logging.level.org.hibernate.SQL=DEBUG
# 쿼리 줄바꿈
spring.jpa.properties.hibernate.format_sql=true
# 매개변수 값 보여주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE



로깅설정을 마치자 콘솔에 사진과 같이 출력됨.
이게 맞는건가 했는데 책에도 똑같이 나오는걸 보면 정상인듯함.

아래는 Article Entity의 id필드를 DB가 직접 auto increment로 생성하도록 수정하는 파트.
나의 경우 처음부터 H2가 아닌 mariaDB를 사용하였기에 1주차 포스팅에서 미리 적용해두었음.

// 어노테이션 생략
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)     // 자동생성. GenerationType.IDENTITY는 기본키 생성을 DB에 맞기는 전략.
    private Long id;
    @Column
    private String title;
    @Column
    private String content;
}

@GeneratedValue(strategy = GenerationType.IDENTITY)해당 어노테이션이 자동으로 값을 생성해주는 기능을 가졌으며, strategy = GenerationType.IDENTITY 속성을 추가하면 insert작업마다 DB에서 직접 필드값을 생성한다. (자동카운팅)

셀프체크

CREATE TABLE burgers(
	id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	NAME VARCHAR(50),
	price INTEGER,
	gram INTEGER,
	kcal INTEGER,
	protein INTEGER
);

SELECT * FROM burgers;

INSERT INTO burgers(NAME, price, gram, kcal, protein)
VALUES ('행운버거 골드', 5300, 222, 540, 25);
INSERT INTO burgers(NAME, price, gram, kcal, protein)
VALUES ('트리플 치즈버거', 6300, 219, 619, 36);
INSERT INTO burgers(NAME, price, gram, kcal, protein)
VALUES ('빅맥', 5300, 223, 583, 27);

DELETE FROM burgers WHERE id = 2;


10일차

part3. REST API와 테스트 코드 작성하기

REST API와 JSON

https://jsonplaceholder.typicode.com/
위의 사이트를 참고하여 JSON데이터를 주고받는 실습.
실습에는 postman을 사용하였음.

GET 요청 및 응답


https://jsonplaceholder.typicode.com/posts/1
사이트에서 제공하는 포스트는 총 100개로 위는 1번째 포스트를 조회한 결과, 아래는 101번째 포스트를 조회한 결과.
위는 200번대 응답과 JSON데이터가 돌아왔지만 아래는 잘못된 조회로 404에러응답이 돌아옴.
https://jsonplaceholder.typicode.com/posts/101

POST 요청 및 응답


https://jsonplaceholder.typicode.com/posts 경로로 위 사진대로 JSON 데이터를 요청한 결과.
101번 데이터가 새로 생성되었다.

PATCH 요청 및 응답


https://jsonplaceholder.typicode.com/posts/1 에 PATCH로 수정할 JSON데이터를 요청한 결과.
수정을 요청한 데이터만 수정되었다.

DELETE 요청 및 응답


https://jsonplaceholder.typicode.com/posts/10 에 DELETE로 삭제할 데이터를 요청한 결과.
응답값은 따로 없다.

profile
천 리 길도 가나다라부터

0개의 댓글