오늘 CodeKata는 1문제를 풀었다. 첫번째 문제가 구현+Bruteforce 문제였기에 오래 걸린 것도 있었지만, 두 번째 문제도 만만치 않은 문제고, 시간이 오래 걸릴것이라 판단해서 푸는 것을 내일로 미루었다.
일단 내일 계속 풀 것이지만, 어디에서 막혔는지 적어보기로 하자.
https://school.programmers.co.kr/learn/courses/30/lessons/87377
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제를 보고 일단, 해당 직선을 내가 알기 쉬운 형태로 바꿨다. 즉, ax + by + c = 0의 형태를 y = ax + b의 형태로 바꾸는 것 부터 해서
val a = line.map { -it[0].toDouble() / it[1].toDouble() }
val b = line.map { -it[2].toDouble() / it[1].toDouble() }
각 직선의 기울기의 y 절편을 계산해서 교점을 구했다. 그런데, 여기서 문제가 발생했는데, y축 혹은 x축 에 평행한 교점을 구하지 못한다는 것이다. 이것을 해결해야하는데, 아쉽게도 시간이 오래걸려서 일단 이 부분은 내일 이어서 풀어보도록 하자.
오늘은 이전에 했던 과제의 코드를 수정하는 시간을 가졌다. 일단 가장 기억에 남는 것은 DTO와 Entity 간의 변환이다.
만약 Entity에 DTO로 바꿔서 반환하는 메소드를 만들게 되면 Entity가 DTO에 의존하게 된다, 만약 내가 DTO를 수정하게 된다면, Entity를 수정하게 되는데 Entity가 DTO보다 더 중요한 객체임으로 이것은 바람직하지 않다.
즉, Entity를 DTO에 의존하는 것이 아니라 DTO가 Entity에 의존하도록 수정해야한다. 이전의 나는 이것을 모르고 Entity를 DTO로 바꾸는 메소드를 구현해서 과제에 사용했다. 심지어 CreateDTO도 Entity 내에서 사용하는 것이 더 좋다고 생각을 했었다. 하지만, 지금의 나는 그것이 좋은 것이 아닌 것을 알게 되었고, 수정을 거쳤다.
// 이전의 TODO Entity의 일부
companion object {
fun from(createDTO: TodoCreateDTO, writer: Member): Todo
{
return Todo(title = createDTO.title, content = createDTO.content,
writer = writer, createdDate = createDTO.createdDate, complete = false)
}
}
// 위의 코드를 삭제, 지금의 TodoCreateDTO
fun to(memberRepository: MemberRepository): Todo
{
return Todo(title = title, content = content,
createdDate = createdDate, complete = false).apply {setWriter(memberRepository)}
}
여기에 나는 지금까지 걸렸던 Entity 간의 상속을 활용을 해보기로 한다.
지금까진, SecurityUtil이란 Companion Object를 활용한 클래스에 checkUserCanAccessThis란 메소드를 정의해서 사용했는데, 이 메소드를 활용하기 보단 상속을 사용해서 member와 연관된 중복된 부분을 부모 클래스로 빼서 Check를 하는 것이 더 효율적이라 판단했다.
하지만, 여기서 문제가 있었는데, 내가 JPA의 상속을 모른다는 것이였다. 어떻게 할 까 고민을 했었는데, 이전엔 내가 일일히 table을 만들었었는데, Auto-ddl을 사용하면 @Entity를 붙이기만 해도 자동으로 table을 만들어준다는 것을 후에 배우게 되었다. 그래서 이것을 활용하면, 내가 JPA에서의 상속을 자세히 몰라도 활용을 할 수 있게 된다. 그래서 기존의 Table들을 싹 다 지우고, 작성자를 가지는 Post Entity를 만들어서 상속을 하도록 수정하였다. 처음엔 막무가내로 그냥 상속을 사용했지만, 테이블이 꼬이게 되었다.
결국 검색을 해본 결과 @Inheritance를 사용을 하란 정보를 얻었다.
@Inheritance에 strategy는 해당 annotation을 다룬 게시글마다 달라서 어떤 것을 사용해야 할 지, 고민했지만, 자동완성에 있는 strategy들을 하나 씩 시험을 해서 제일 괜찮아 보이는 InheritanceType.JOINED를 활용해서 테이블을 만들었다. 그렇게 깔끔하게 테이블이 만들어졌다!
그렇게해서 이전의 방법보다 더 깔끔하게 코드를 짤 수 있게 되었다.
// 이전에는 멤버를 추출해서 SecurityUtil에서 비교했다.
fun checkUserCanAccessThis(member: Member, name: String)
{
if(member.username != getUsername()) throw NotHaveAuthorityException(name)
}
// Member 변수를 공통적으로 가진 Post를 만들어서 비교한다.
fun checkLoginMemberPostThis(memberRepository: MemberRepository)
{
if(writer != SecurityUtil.getLoginMember(memberRepository))
throw NotHaveAuthorityException(this.javaClass.name)
}
특기할 점은 이전에는 클래스 이름을 직접 넣어줬는데, 여기서는 클래스 이름을 자동으로 넣어줘서 더 편리해졌다.
앞으로도 상속을 적극적으로 활용할 방법을 모색해보도록 하고, 내일은 JPA 강의를 듣도록 하자.
'부트캠프 일지' 카테고리의 다른 글
부트캠프 51일차 후기 (1) | 2024.02.07 |
---|---|
부트캠프 50일차 일지 (1) | 2024.02.06 |
부트캠프 48일차 일지 (1) | 2024.02.02 |
부트캠프 47일차 후기 (0) | 2024.02.01 |
부트캠프 46일차 후기 (0) | 2024.01.31 |