· 오늘 공부한 것
기술면접 2개
알고리즘 문제풀이
모집글 수정 로직
· 공부한 내용, 궁금한 내용, 부족한 내용
- 브라우저의 작동방식에 대해서 설명해주세요.
- 단계별로 상세한 프로세스를 나눠서 설명
- 쿠키, 세션의 개념과 차이를 설명해보세요.
- 무상태(stateless) 이 기술이 왜? 생겨났는지
모집글 수정하는 로직을 구현했는데 팀원끼리 회의했을 때 entity를 작성할 때 @Setter나 데이터를 변경하는 메서드를 사용하지 않기로 정하였다. 그래서 수정을 할 때 수정할 객체를 builder로 만들어서 save() 메서드를 사용해서 구현을 하였다. 처음 글을 작성할 때도 save() 메서드를 사용했는데 이는 해당 메서드가 DB에 있는 경우에는 받은 데이터로 덮어씌우고 없는 경우에는 새로 만들기 때문이다.
그래서 builder로 업데이트한 객체를 만들어서 저장을 했는데 post가 postStack, jobLimit 엔티티와 관계를 형성하고 있기 때문에 받아온 데이터로 각각을 수정하기 전에 삭제하는 과정을 거쳤다. 물론 삭제과정없이 받아온 데이터로 변경하는 로직을 구현하면 좋지만 분리된 entity의 성격상 비효율적이라고 판단했다. 우리가 모집글 관련 정보를 분리한 이유는 1개의 컬럼에 1개의 정보만을 담는 규칙을 지키기 위해서였다. 그래서 수정이 되었다면 전에 데이터를 지우고 새로 저장하는 방식이 더 간단했다. 수정 전의 데이터가 유의미하다면 히스토리성 테이블로 만들어서 남겨두겠지만 모집글조회할 때 보여주기용도로만 사용하는 데이터들이기 때문에 남겨두지 않았다.
@Transactional
public void updatePost(PostUpdateReq postUpdateReq, MultipartFile image) throws IOException {
// 해당하는 기존 모집글의 정보를 가져온다.
Post post = postRepository.findByPostId(postUpdateReq.getPostId());
// post가 없는 경우 validation 처리
// 모집글의 작성자와 인증된 유저가 같은지 확인 (validation)
// 수정한 이미지 파일 처리
String imageUrl = ImageFileHandler.uploadImage(image);
// 업데이트한 Post 만들기
Post updatedPost =
postRepository.save(
Post.builder()
.postId(postUpdateReq.getPostId())
.title(postUpdateReq.getTitle())
.content(postUpdateReq.getContent())
.deadline(postUpdateReq.getDeadline())
.status(post.getStatus())
.visit(post.getVisit())
.imageUrl(imageUrl)
.build());
// 해당 모집글에 관련된 엔티티 제거
postStackRepository.deleteAllByPostId(postUpdateReq.getPostId());
jobLimitRepository.deleteAllByPostId(postUpdateReq.getPostId());
List<PostStack> postStacks = new ArrayList<>();
postUpdateReq
.getSkills()
.forEach(
skill -> {
postStacks.add(PostStack.builder().skill(skill).post(updatedPost).build());
});
postStackRepository.saveAll(postStacks);
List<JobLimit> jobLimits = new ArrayList<>();
postUpdateReq
.getJobLimits()
.forEach(
jobLimit -> {
jobLimits.add(
JobLimit.builder()
.job(jobLimit.getJob())
.headcount(jobLimit.getHeadcount())
.post(updatedPost)
.build());
});
jobLimitRepository.saveAll(jobLimits);
}
코드가 길어졌는데 모집글 작성하는 createPost메서드에서 겹치는 부분이 있기 때문에 따로 해당 부분을 빼서 리팩토링 할 예정이다. 그리고 아직 예외처리나 validation을 안했기 때문에 성공유무만 일단 확인한 코드이다. 테스트코드도 작성해봐야 할 것같다.
· 오늘 서칭 한 자료
@Builder 패턴으로 객체 수정시 값이 초기화 되는 문제
지난번 객체를 생성할 때 연관관계에 있는 List 속성이 null 로 생성되는 문제를 해결한 후 발생한 문제이다.생성한 객체를 수정하면 특정 부분만 수정되는 것이 아닌 기존 객체에 수정한 객체가
velog.io
https://developer.mozilla.org/ko/docs/Web/Performance/How_browsers_work
웹페이지를 표시한다는 것: 브라우저는 어떻게 동작하는가 - 웹 성능 | MDN
사용자는 로드가 빠르고 상호작용이 원활한 컨텐츠로 이루어진 웹 경험을 원합니다. 따라서 개발자는 이 두 가지 목표를 달성하기 위해서 부단히 노력해야합니다.
developer.mozilla.org
쿠키(Cookie)와 세션(Session)의 차이 (+캐시(Cache))
쿠키와 세션을 사용하는 이유? HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용한다. HTTP 프로토콜의 특징 1. Connectionless 프로토콜 (비연결 지향) 클라이언트가 서버에 요청(Request)을 했을
dev-coco.tistory.com
· 느낀 점
- 기존에 사용하던 set메서드나 해당 entity에 업데이트하는 메서드를 만들지 않고 builder로 만들어서 진행하니 막히는 부분이 있었지만 팀원의 도움으로 해결할 수 있었다. 팀프로젝트의 장점!!
- CRUD 기본 로직들만 빠르게 구현하고 예외처리나 validation과 같은 부분들을 붙여나가면서 리팩토링해야 할 거 같다.
'Today I Learned' 카테고리의 다른 글
2024-01-15 TIL 최종프로젝트(7) (1) | 2024.01.16 |
---|---|
2024-01-12 TIL 기술면접, 최종프로젝트(6) (0) | 2024.01.12 |
2024-01-10 TIL 기술면접, 최종프로젝트(4) (0) | 2024.01.10 |
2024-01-09 TIL 최종프로젝트(3) (0) | 2024.01.10 |
2024-01-08 TIL 기술면접, 최종프로젝트(2) (0) | 2024.01.08 |