10.3 Spring Security를 이용한 OAuth2 구현 - 글쓴이 추가

SummerToday·2024년 3월 16일
1
post-thumbnail
post-custom-banner

글쓴이 추가

글에 글쓴이를 추가하는 로직들을 작성한다.

// domain - Article.java

@Entity
@Getter
@NoArgsConstructor
public class Article{
    
    ~ 생략 ~

    @Column(name = "author", nullable = false)
    private String author;

    ~ 생략 ~

    @Builder
    public Article(String author, String title, String content) {
        this.author = author;
        this.title = title;
        this.content = content;
    }

      ~ 생략 ~

}

  • 기존 글을 작성하는 API에서 작성자를 추가로 저장하기 위해 DTO 패키지의 AddArticleRequest의 toEntity() 메서드를 수정해 author 값도 추가하도록 변경한다.
// dto - AddArticleRequest.java

@NoArgsConstructor //기본 생성자 추가
@AllArgsConstructor // 모든 필드 값을 파라미터로 받는 생성자 추가
@Getter
public class AddArticleRequest { // 서비스계층에서 요청 받은 데이터를 엔티티로 생성.

    private String title;
    private String content;

    public Article toEntity() { // 생성자를 사용해 객체 생성
        return Article.builder()
                .title(title)
                .content(content)
                .author(author)
                .build(); // 빌더 패턴을 사용해 DTO를 엔티티로 만들어주는 메소드.
    }
}

  • service 패키지의 BlogService.java 파일을 연 다음 save() 메서드에서 유저 이름을 추가로 입력 받고 toEntity()의 인수로 전달 받은 유저 이름을 반환하도록 코드를 수정한다.
// service - BlogService.java

@RequiredArgsConstructor
@Service 
public class BlogService {
    
     ~ 생략 ~
   
   public Article save(AddArticleRequest request, String userName) {
        return blogRepository.save(request.toEntity(userName));
   }
    
     ~ 생략 ~
    
}    

  • controller 패키지의 BlogService의 save 메서드에서 유저 이름을 추가로 입력받고 toEntity()인수로 전달받은 유저 이름을 반환하도록 코드를 수정한다.
// controller - BlogApiController.java 

@RequiredArgsConstructor
@RestController // HTTP Response Body에 객체 데이터를 JSON 형식으로 반환하는 컨트롤러
public class BlogApiController {

      ~ 생략 ~ 

    @PostMapping("/api/articles")
    public ResponseEntity<Article> addArticle(@RequestBody AddArticleRequest request, Principal principal) {
        Article savedArticle = blogService.save(request, principal.getName());

        return ResponseEntity.status(HttpStatus.CREATED)
                .body(savedArticle);
    }
    
       ~ 생략 ~ 
    
}

  • 글 상세 페이지에서 글쓴이의 정보가 보일 수 있도록 ArticleViewResponse.java 파일도 수정한다.
// dto - ArticleViewResponse.java

@NoArgsConstructor
@Getter
public class ArticleViewResponse {

      ~ 생략 ~
    
    private String author;

    public ArticleViewResponse(Article article) {
        this.id = article.getId();
        this.title = article.getTitle();
        this.content = article.getContent();
        this.createdAt = article.getCreatedAt();
        this.author = article.getAuthor();
    }
   
}

  • 스프링 부트 애플리케이션이 실행될 때 마다 데이터를 추가하기 위해 data.sql 파일에도 author 칼럼을 추가한다.
INSERT INTO article (title, content, author, created_at, updated_at) VALUES ('제목1', '내용1', 'user1', NOW(), NOW())
INSERT INTO article (title, content, author, created_at, updated_at) VALUES ('제목2', '내용2', 'user2', NOW(), NOW())
INSERT INTO article (title, content, author, created_at, updated_at) VALUES ('제목3', '내용3', 'user3', NOW(), NOW())

  • 뷰에서 글쓴이의 정보를 알 수 있도록 뷰를 수정한다.
// resources - temlplates - article.html

  ~ 생략 ~
  
<header class="mb-4">
        <h1 class="fw-bolder mb-1" th:text="${article.title}"></h1>
        <div class="text-muted fst-italic mb-2" th:text="|Posted on ${#temporals.format(article.createdAt, 'yyyy-MM-dd HH:mm')} By ${article.author}|"></div>
  
  ~ 생략 ~



해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글