⏱️ 오늘의 일정 ⏱️
9:00 ~ 10:00 - 알고리즘 코드 카타
10:00 ~ 11:00 - 팀 회의
11:00 ~ 12:00 - 챌린지반 강의 듣기
12:00 ~ 13:00 - 점심시간
13:00 ~ 15:00 - 챌린지반 과제
15:00 ~ 17:00 - git hub 워크플로 정리
17:00 ~ 18:00 - 스프링 심화 주차 개인 과제
18:00 ~ 19:00 - 저녁 시간
19:00 ~ 20:00 - 스프링 심화 주차 개인 과제
20:00 ~ 21:00 - TIL 작성
챌린지반 과제
4. 연관관계 조회 시 발생하는 N+1 에러
이 에러를 선택한 이유는, 다른 항목들은 단순 에러 해결의 문제였지만 이건 에러라기 보단 성능 최적화에 대한 문제였기 때문에 실무적으로 도움이 될 것 같아서 이다.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class NPlusOneTest {
@Autowired
TeamRepository teamRepository;
@Autowired
UserRepository userRepository;
// user가 5명씩 있는 팀 5개 생성하는 메서드입니당
@Test
@DisplayName("생성")
void create() {
for(int i = 0; i < 5; i++) {
Team team = new Team();
for(int j = 0; j < 5; j++) {
User user = new User();
user.setTeam(team);
}
teamRepository.save(team);
}
}
@Test
@DisplayName("N+1 발생")
@Transactional
void test1() {
List<Team> all = teamRepository.findAll(); // findAll 사용
System.out.println("============== N+1 시점 확인용 ===================");
for(Team team : all) {
team.getUsers().size(); // 5번 찾아온다.
}
}
@Test
@DisplayName("N+1 해결")
@Transactional
void test2() {
List<Team> all = teamRepository.findAllFetchJoin(); // Fetch Join 사용
System.out.println("============== N+1 시점 확인용 ===================");
for(Team team : all) {
team.getUsers().size(); // 이미 위에서 user entity까지 싹 다 조회해서 쿼리 더 안 날림.
}
}
}
public interface TeamRepository extends JpaRepository<Team, Long> {
// JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 한 번에 조회.
// 일반 조인은 연관된 엔티티를 함께 조회하지 않음.
// 모든 team을 조회하며 team과 연관된 user도 같이 조회했다.
@Query("select t from Team t join fetch t.users")
List<Team> findAllFetchJoin();
}
GitHub 워크플로 정리
팀원들에게 보여주기 위해 글을 작성하였다.
Fixture Monkey
@Test
@DisplayName("createPost 테스트")
void testCreatePost() throws Exception {
// given
mockUserSetup();
// PostCreateRequestDto requestDto = new PostCreateRequestDto();
// requestDto.setTitle("title");
// requestDto.setContents("contents");
PostCreateRequestDto requestDto = fixtureMonkey.giveMeOne(PostCreateRequestDto.class);
System.out.println(requestDto.getContents());
// when
ResultActions actions = mockMvc.perform(post("/api/post")
.content(objectMapper.writeValueAsString(requestDto))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.principal(mockPrincipal)
);
// then
actions.andExpect(status().isCreated())
.andDo(print());
}
test코드에 픽쳐몽키를 적용해 봤다...
content에 담긴 글자
ఁ笥計⾤ꀂ뒍佮ى쉮蚅訢桾㘔삉鸒ᨁ⊈裚ﺁ瞭怍ꩥ앳頉羂補픅鎥種뉚岚흿갧쏂惮菑忰벃沒긭幠줂顙픽 䴵௪鈴拑羶愄㜵ᑱ銌骝ꀑ䯛鐵䨊鷋歆饆ꞛஷ訄◁완ᦤꂄ収ǣ덼ꭆꉒ촞ꮿ瓛ɓ錸膎㯀槔꒕⊿ꂯ鑦隶ࢰ铄콀釷᮰Q䳺죘磹㗧肍畳ڂ䠠ꄿ崶啚Ꮿӽ薩뜟茀㥷᪸ꙕ㭩✮㚼⺱댁¿警倡껱ﲡ젧ዴ戗뵒㠢优黴㽒噟茄꜖ﮪ蛹鋬蝔䍒睨㦌蹚폽폒鯲ဃ攳⾐鈾鲤潕䷐풺Ð咶냨莰闬鸉脩彞Ⱥ⇱ﭬ肌䑯務쁎것걩筱춏읔䨋띹㐏䮥ᅰ㣎娱俺➨쯝䱃존짤궱С楎↻͜眢㍴䀗꼌ᣏ睋苓⮒Ჭ턜㈨岙嬥䱣芌៳䓐譹㲪ሱ㼢뿛퐜⩹嶋篓柢固ꤻ⑸ܱ橅蝐恛䦬癸ﶲ雷툾㉺밀♲唢苊ㅛᆰ夡ᕢ߸䧃㤚顟葘⌼缟麘⛵
정말 랜덤한 값이 들어간다...
어쨌든 이제 코드몽키에 대해 완벽하게 이해 했다.
이제 @TestContainer만 하면 모든 과제 끝~ 고생했다!
'공부 기록 > 내배캠Java_5기' 카테고리의 다른 글
[내배캠][TIL] 43일 차 - 화요일, 팀원과 자주 대화하기 (0) | 2024.06.18 |
---|---|
[내배캠][TIL] 42일 차 - 월요일, 팀원과 자주 대화하기 (0) | 2024.06.17 |
[내배캠][TIL] 40일 차 - 목요일, 테스트라는 이름의 노가다 (2) | 2024.06.14 |
[내배캠][TIL] 39일 차 - 수요일, 스프링 심화 주차 시작 (0) | 2024.06.12 |
[내배캠][TIL] 38일 차 - 화요일, 정리하며 (2) | 2024.06.11 |