공부 기록/내배캠Java_5기

[내배캠][TIL] 41일 차 - 금요일, 우끼끼

노루동산 2024. 6. 14. 20:46
반응형

 

 

 

⏱️ 오늘의 일정 ⏱️

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 워크플로 정리

 

[GitHub] Issue 생성, feature 브랜치 생성, Pull Request, dev에 merge까지

포스트 작성에 앞서이 포스트는 팀원들에게 공유의 목적으로 작성되었습니다.이 작업 플로우는 우리 팀의 작업 방식이기 때문에 누군가 이 포스트를 보게 된다면 그대로 따라갈 필요는 없습니

mountain-noroo.tistory.com

팀원들에게 보여주기 위해 글을 작성하였다.

 

 

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만 하면 모든 과제 끝~ 고생했다!

 

 

[Spring] 🙉Fixture Monkey🙉

Fixture Monkey란? Fixture Monkey naver.github.io 나는 새로운 프레임워크, 라이브러리 등을 공부할 때 꼭 도큐먼트부터 찾아간다.블로그 글 여럿 보는 것보다 Docs 한 번이 더 도움 된다.게다가 Fixture Monkey

mountain-noroo.tistory.com

 

반응형