src
main
ㄴ resources
ㄴ static
ㄴ images
ㄴ index.html
ㄴ templates
ㄴ application.properties
ㄴ java
ㄴ com.sparta.week03
ㄴ controller
ㄴ MemoController
ㄴ domain
ㄴ Memo
ㄴ MemoRepository (i)
ㄴ MemoRequestDto
ㄴ Timestamped
ㄴ sevice
ㄴ MemoService
ㄴ Week03Application
1. Controller : 가장 바깥, 요청/응답 처리
2. Service : 중간, 실제 중요한 작동이 많이 일어나는 부분
3. Repo : 가장 안쪽, DB와 맞닿아 있음.(repo, entity)
타임라인 API
기능 | Method | URL | Return |
---|---|---|---|
메모 생성 | POST | /api/memos/ | Memo |
메모 조회 | GET | /api/memos | List<Memo > |
메모 변경 | PUT | /api/memos/{id} | Long |
메모 삭제 | DELETE | /api/memos/{id} | Long |
Service - @Transactional DB에 반영이 꼭 되게
Controller - @RequiredArgsConstructor
- @RestController - new MemoController 이런걸 자동으로 생성
- @PathVairable 주소에 있는 걸 사용
- @RequestBody 요청할 때 body에 있는 걸 받아서 넣어줘
Week03Appliacation - @EnableJpaAuditing JPA 사용가능
domain
ㄴ Memo
ㄴ MemoRepository (i)
ㄴ MemoRequestDto
ㄴ Timestamped
# Timestamped.java
@Getter
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findAllByOrderByModifiedAtDesc();
}
@Getter
public class MemoRequestDto {
private String username;
private String contents;
}
service
ㄴ MemoService
@RequiredArgsConstructor
@Service
public class MemoService {
private final MemoRepository memoRepository;
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
memo.update(requestDto);
return memo.getId();
}
}
# Memo.java 에 메소드추가
public void update(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
Controllter
ㄴ MemoController
@RequiredArgsConstructor
@RestController
public class MemoController {
private final MemoRepository memoRepository;
private final MemoService memoService;
@PostMapping("/api/memos")
public Memo creatMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
return memoRepository.save(memo);
}
@GetMapping
@PutMapping
@DeleteMappint
}
writePost()
1. 사용자가 입력한 메모 내용 확인
2. POST API 사용해서 메모 신규 생성
3. 화면 새로고침하여 업데이트된 메모 목록 확인
getMessages()
1. 기존 메모 제거(html)
2. GET API 사용해서 메모 목록 불러오기
3. 메모마다 html 만들고 붙이는 함수 만들기
24시간 이내 포스팅만 가져오기
# MemoRepository.java
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findAllByModifiedAtBetweenOrderByModifiedAtDesc(LocalDateTime start, LocalDateTime end);
}
# MemoController.java
@GetMapping("/api/memos")
public List<Memo> getMemos() {
LocalDateTime start = LocalDateTime.now().minusDays(1);
LocalDateTime end = LocalDateTime.now();
return memoRepository.findAllByModifiedAtBetweenOrderByModifiedAtDesc(start, end);
}
submitEdit()
1. 작성 대상의 메모 username과 contents를 확인
2. 작성한 메모가 올바른지 확인
3. 전달할 data를 json으로 바꾸기
4. PUT /api/memos/{id}에 data를 전달
<div class="contents">
<div id="${id}-contents" class="text"> // 수정 안할 때
${contents}
</div>
<div id="${id}-editarea" class="edit"> // 수정할 때
<textarea id="${id}-textarea" class="te-edit" name="" id="" cols="30" rows="5"></textarea>
</div>
</div>
# 수정할 때 edit div에서 가져옴
let contents = $(`#${id}-textarea`).val().trim();
deleteOne()
1. DELETE API 사용해서 메모 삭제