본문 바로가기

부트캠프 일지

부트캠프 31일차 후기

오늘 CodeKata는 1문제를 풀었다. 처음으로 막히는 문제를 만나서 해결하는데 시간을 소비해버렸다.

이 문제를 해결하는 과정에서 가장 기억에 남는 오류는 마지막에 만난 시간초과 오류이다.

해당 문제는 반복문을 활용한 구현문제였기에, 처음엔 재귀를 활용해 문제를 풀었는데,  시간초과가 났다. 분명 로직은 그렇게까지 시간을 소비할 것 같지 않아서 이번엔 반복문으로 바꿔서 문제를 풀었지만, 이번에도 시간초과를 맞이한다.

다른 사람들의 답안을 보아도 나랑 비슷한 흐름대로 풀어서, 혹시 Kotlin으로 이 문제를 풀 수 없나는 생각이 내 뇌를 어지럽혔었다.

 

혹시 메인 로직이 아닌 다른 곳에서 시간초과가 난 것이 아닌가란 생각이 막 들었을 때, 다른 곳으로 눈길을 돌려보았다. 그러자, 의심스러운 곳을 발견하였다. 내 코드는 메인 로직을 거친 후, 답을 IntArray의 뒤에 넣는 과정이 존재한다. 이때 최대 1000000번의 반복을 도는데, 여기서 길이가 불변이여서 뒤에 원소를 넣으면 메모리를 잡는 과정이 추가로 필요한 String이 떠올랐다. 만약 이 IntArray도 String과 비슷하다면? 그래서 원소를 뒤에 넣는게 아니라 처음부터 필요한 만큼의 메모리를 잡고, index를 하나씩 더해나가는 방식을 시험해보았다. 그리고 마침내 정답을 얻었다. 그렇게 이 문제를 푸는데, 아침부터 힘들어졌다. 다음부턴 뒤에 원소를 추가하는 연산자는 삼가자.

 // 이것 보단.
 for(i in 0 until n)
 {
     for(j in (0 .. i))
     	answer += g[i][j]
  }

 // 이게 낫다.
 for(i in 0 until n)
 {
     for(j in (0 .. i))
          answer[idx++] = g[i][j]
 }

오늘은 어제에 이어서 이미지와 앨범을 연결하는 작업을 하였다. 이미지의 CRUD는 어제 다 완성을 해서, 앨범과 연결을 하는 작업은 오래 걸리지 않을 거라고 생각을 했었다. 하지만 그것은 큰 오산이였다.

 

일단 첫째, DTO와 함께 Multipart를 전달하는 법에서 부터 막혔다. 내가 어제 CRUD를 할 수 있었던 것은 Multipart 하나만 전달해서 비교적 쉽게 갔었는데, 막상 DTO와 함께 하려니, 예상치 못한 오류가 계속 발생했다. RequestBody가 아닌 RequestPart를 쓰고, AbstractJackson2HttpMessageConverter를 상속받는 Component를 MediaType.APPLICATION_OCTET_STREAM을 추가해서 Bean으로 등록하고 나서야 관련된 에러를 피할 수 있었다.

@Component
class multiparJacksontHttpMessageConverter(objectMapper: ObjectMapper)
    : AbstractJackson2HttpMessageConverter(objectMapper, MediaType.APPLICATION_OCTET_STREAM) {

}

그리고 둘째, 확장성을 생각해서, 상속을 사용했었다. 즉, image와 그것을 상속한 albumimage를 만들과 album을 가리키려 했다. 그런데, 처음 해보는 것이라서 여기서도 고민을 많이 했다. 가장 기억에 남았던 것은 albumimage 타입을 그냥 ImageService에 넣으면 그냥 Image로 저장되어서 이것을 어떻게 확장성 있게, 해결할 지가 관건이였다. 일단은 albumImage를 저장하는 함수를 따로 만들고, 후에 리팩토링을 다짐했다.

 

마지막 세번째, 여기서 가장 고생했는데, 앨범을 만들 때, 이미지도 같이 만드는 메소드인데, 앨범을 먼저 만들까? 아니면, 이미지를 먼저 만들까? 가 고민이 되었다. 이미지를 먼저 만들어서 저장을 하면, 이미지가 멋대로 albumID를 만들거나, 중복된 아이디를 저장할 수 없다는 오류가 발생했고, 앨범을 먼저 만들면 원인불명의 오류가 발생했다.

 

결국 상속을 포기하고, album이 image를 가르키는 단방향 @OneToOne으로 바꿔서 문제를 해결했지만, 뭔가 해결된게 아닌 것 같아서 찜찜하다. 어쨌든 정상적으로 작동은 되고, 어차피 앨범을 통해서만 이미지를 가르키니까, 이대로 가보도록 하자.

 

내일은 지금까지 친 코드를 리뷰를 할 것이다. 테스트를 대충하고 넘어간 부분이 있어서, 테스트도 좀 해보고, 약간의 리팩토링도 할 예정이다. 오늘은 다른 팀원 분들의 코드를 보고 조언을 하는 시간을 꽤 가졌는데, 아직 이 팀 프로젝트를 완성하려면 내 예상보다 약간의 시간이 더 필요할 것 같다고 느끼게 되었다. 좀 더 힘내자.

'부트캠프 일지' 카테고리의 다른 글

부트캠프 33일차 후기  (1) 2024.01.12
부트캠프 32일차 후기  (1) 2024.01.11
부트캠프 30일차 후기  (2) 2024.01.09
부트캠프 29일차 후기  (1) 2024.01.08
부트캠프 28일차 후기  (1) 2024.01.05