1. form.html 생성
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<div th:replace="~{fragments/header :: header}"></div>
<title>게시글 작성</title>
<meta charset="utf-8">
<body>
<div class="container">
<header class="py-5 text-center" id="post header">
<h1>게시글 작성</h1>
</header>
<script src="https://cdn.jsdelivr.net/npm/vue@5.0.8/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<form role="post_form" action="/posts" method="post" th:object="${PostRequest}">
<div class="row mb-3 justify-content-md-center">
<label class="col-sm-2 col-lg-1 col-form-label text-sm-end" for="title">제목</label>
<div class="col-sm-8 col-lg-9">
<input class="form-control" id="title" name="title" placeholder="제목을 입력하세요" type="text" for="title">
</div>
</div>
<div class="row mb-3 justify-content-md-center">
<label class="col-sm-2 col-lg-1 col-form-label text-sm-end" for="content">본문</label>
<div class="col-sm-8 col-lg-9">
<textarea class="form-control" id="content" name="content" required rows="5" for="content"></textarea>
</div>
</div>
<div class="row mb-5 justify-content-md-center">
<div class="col-sm-10 d-grid gap-2 d-sm-flex justify-content-sm-end">
<button class="btn btn-primary" id="submit-button" type="submit">저장</button>
<button class="btn btn-secondary" id="cancel-button" type="button">취소</button>
</div>
</div>
</form>
</div>
</body>
<div th:replace="~{fragments/footer :: footer}"/>
</html>
2. 테스트코드 게시글 작성
@Test
@WithMockUser(roles = "USER")
@PreAuthorize("hasRole('ROLE_USER')") // ROLE_USER 권한이 필요한 경우
public void newPost() throws Exception {
// Given
PostsRequest request = new PostsRequest("title", "content");
when(postService.savePost(any())).thenReturn(1L); // Mocking postService behavior
// When
MvcResult result = mvc.perform(post("/posts")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(request)))
.andExpect(status().isOk())
.andReturn();
// Then
String responseBody = result.getResponse().getContentAsString();
Long responseId = Long.parseLong(responseBody);
assertThat(responseId).isGreaterThan(0L);
}
아무리 테스트 코드 만져봐도 403error를 못벗어나서 member 권한을 만들고 게시판 테스트 하기로 결정함
SpringSecurity는 게시판이랑 member 만든다음에 추가할걸 후회중이다..
1. Entity
@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Member extends AuditingFields{
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_no")
private Long MemberNo;
@Id
@Column(name = "email", unique = true)
private String email;
@Column
private String Password;
@Column
private String nickname;
@Column
private String name;
@Column
private LocalDate birthday;
// @Enumerated(EnumType.STRING)
// @Column(nullable = false)
// private Role role;
@JsonIgnore
@OneToMany(mappedBy = "member")
private List<Post> posts = new ArrayList<>();
@JsonIgnore
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
@Builder
public Member(String email, String password, String nickname,
String name,LocalDate birthday, String createBy){
this.email =email;
this.Password =password;
this.nickname = nickname;
this.name = name;
this.birthday = birthday;
}
public static Member of(String email, String password, String name, String nickname, LocalDate birthday) {
return new Member(null,email,password,name,nickname,birthday,null,null);
}
public void setNickname(String name){
this.nickname =name;
}
public static Member of(Long member_no, String email, String nickname, String password, String name, LocalDate birthday){
return new Member(member_no, email, nickname,password,name,birthday,null,null);
}
public static Member of(Long id, String email, String nickname, String password, String name, LocalDate birthday,List<Post> posts,List<Order> orders){
return new Member(id, email, nickname,password,name,birthday,posts,orders);
}
}
2. memberdto
public record MemberDto (
String email,
String nickname,
String password,
String name,
LocalDate Birthday,
LocalDateTime CreatedAt,
LocalDateTime modifiedAt
)
{
public static MemberDto of(String email, String nickname, String password, String name,LocalDate Birthday){
return new MemberDto(email, nickname,password,name,Birthday,null,null);
}
public static MemberDto of( String email, String nickname, String password, String name, LocalDate birthday, LocalDateTime createdAt, LocalDateTime modifiedAt){
return new MemberDto(email, nickname,password,name,birthday,createdAt,modifiedAt);
}
public static MemberDto from(Member entity){
return new MemberDto(
entity.getEmail(),
entity.getPassword(),
entity.getName(),
entity.getNickname(),
entity.getBirthday(),
entity.getCreatedAt(),
entity.getModifiedAt()
);
}
public Member toEntity() {
return Member.of(
email,
password,
name,
nickname,
Birthday
);
}
}
3. MemberRepository
@Repository
public interface MemberRepository extends JpaRepository<Member, String> {
Optional<Member> findByEmail(String email);
// Member findByNicknameAndEmail(String nickname, String email);
//
// Member findByNickname(String nickname);
void deleteByEmail(String email);
}
4. MemberService
@Service
@Transactional(readOnly = true)
public class MemberService {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
public MemberService(MemberRepository memberRepository, PasswordEncoder passwordEncoder) {
this.memberRepository = memberRepository;
this.passwordEncoder = passwordEncoder;
}
public Optional<MemberDto> searchEmail(String email) {
return memberRepository.findByEmail(email)
.map(MemberDto::from);
}
@Transactional
public MemberDto saveMember(String email, String password, String name, String nickname, LocalDate birthday) {
String EncodePassword = passwordEncoder.encode(password);
return MemberDto.from(
memberRepository.save(Member.of(email, EncodePassword, name, nickname, birthday))
);
}
저장까지만 일단 만들었다
'포트폴리오 > ohouseClone' 카테고리의 다른 글
6. 게시판 서비스 개발(spring + mysql) crud (0) | 2023.10.24 |
---|---|
5. SpringSecurity 설정 및 customlogin페이지 제작 (0) | 2023.09.05 |
3. 커뮤니티 게시판 서비스 api 개발 & 메인 페이지 (0) | 2023.08.19 |
2. Entity 작성 및 구조도 체크 (0) | 2023.08.16 |
1. 기본 Intellj setting 및 db연결 & 칸반보드 작성 (0) | 2023.08.11 |