인프런 워밍업 클럽 3기 BE 스터디 1주차

인프런 워밍업 클럽 3기 BE 스터디 1주차

💻 강의

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

 

📚 학습

프로젝트 구조

├─kotlin
│  └─com
│      └─jiyeon
│          └─portfolio
│              └─domain
│                  ├─constant
│                  ├─entity
│                  └─repository
└─resources
    ├─static
    └─templates 

BaseEntity

BaseEntity를 추상 클래스로 만들고, 상속 받아서 사용한다

@MappedSuperclass
abstract class BaseEntity {

    @CreatedDate
    @Column(nullable = false, updatable = false)
    var createdDateTime: LocalDateTime = LocalDateTime.now()

    @LastModifiedDate
    @Column(nullable = false)
    var updatedDateTime: LocalDateTime = LocalDateTime.now()
}
@Entity
class Achievement(
    title: String,
    description: String,
    achievedDate: LocalDate?,
    host: String,
    isActive: Boolean) : BaseEntity() {
...
}

Experience와 ExperienceDetail 연관 관계

Experience와 ExperienceDetail은 1 : N 관계를 가진다

Experience에서는 MutableList 타입의 details 필드로 ExperienceDetail을 가져올 수 있지만, ExperienceDetail에서는 매핑된 Experience를 가져올 수 없다 (단방향)

즉, Experience와 ExperienceDetail은 1 : N 단방향 관계를 가진다

@Entity
class Experience(
    title: String,
    description: String,
    startYear: Int,
    startMonth: Int,
    endYear: Int?,
    endMonth: Int?,
    isActive: Boolean) : BaseEntity() {
...
    @OneToMany(
        targetEntity = ExperienceDetail::class,
        fetch = FetchType.LAZY,
        cascade = [CascadeType.ALL])
    @JoinColumn(name = "experience_id")
    var details: MutableList<ExperienceDetail> = mutableListOf()
...
}
@Entity
class ExperienceDetail(
    content: String,
    isActive: Boolean) : BaseEntity() {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null

    var content: String = content

    var isActive: Boolean = isActive
}

mappedBy

양방향 연관 관계에서 주인을 정할 때 mappedBy를 사용해 지정한다

@OneToMany(mappedBy = "project", fetch = FetchType.LAZY, cascade = [CascadeType.PERSIST])
var skills: MutableList<ProjectSkill> = mutableListOf()
@Entity
class ProjectSkill(project: Project, skill: Skill) : BaseEntity() {
...
    @ManyToOne(targetEntity = Project::class, fetch = FetchType.LAZY)
    @JoinColumn(name = "project_id", nullable = false)
    var project: Project = project
...
} 

아쉬운 점

다른 Project를 같이 하다 보니 늦게 강의를 듣게 됐고, 다급하게 과제를 시작했다


보완할 점

Kotlin 문법이 아직 낯설어서 학습 속도가 느린 것 같다

Project에서 사용하는 Kotlin 문법을 같이 공부해 학습 속도를 개선하고, 일정에 차질이 없도록 해야겠다


궁금한 점

1주차 강의를 들으면서 궁금했던 점은 Entity 필드에 private 접근 제한자를 사용하지 않았던 부분이다

Java를 사용해 Project를 했을 때는 외부에서 접근하지 못하도록 Entity 필드에 private 접근 제한자를 사용했는데 강의에서는 Entity에 접근 제한자를 사용하지 않았다

이 부분에서 Java와 Kotlin으로 Entity를 개발하는 것이 다르다고 느껴졌다

// Java

@Entity
@Table(name = "user")
@Getter
@NoArgsConstructor
@SQLDelete(sql = "UPDATE user SET is_deleted = true WHERE id = ?")
public class User extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 50, nullable = false, unique = true)
    private String email;

    @Column(length = 100, nullable = false)
    private String password;

    @Column(length = 20, nullable = false)
    private String nickname;

    @Column(nullable = false)
    @Enumerated(EnumType.STRING)
    private UserRole role;

    private boolean isDeleted = false;

    public User(String email, String password, String nickname, String role) {
        this.email = email;
        this.password = password;
        this.nickname = nickname;
        this.role = UserRole.of(role);
    }
}
// Kotlin

@Entity
class ExperienceDetail(
    content: String,
    isActive: Boolean) : BaseEntity() {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null

    var content: String = content

    var isActive: Boolean = isActive
}

회고

Java를 사용해 Spring Project는 해봤지만, Kotlin을 사용해 Project를 하는 것은 이번이 처음이어서 익숙한 듯 새롭고, 재미있지만 조금 어렵다

어렵게 느껴진 이유는 Kotlin 문법에 익숙해지지 않아서 그런 것 같다

Kotlin을 사용한 여러 Spring Project도 많이 찾아보면서 참고해야겠다 

 

 

🎯 미션 1

  • 코틀린/스프링 부트 프로젝트를 생성

  • 깃허브 리포지토리에 프로젝트 올리기

  • 커밋 메시지 : [미션1] 깃허브 리포지토리에 프로젝트 올리기

  • 미션1 제출 스레드에 깃허브 리포지토리 링크를 공유


문제

미니 프로젝트 주제에 대해 많이 고민 됐고, 일정 지연으로 인해 미션1 제출을 아직 못한 상태이다

해본 적 없는 주제이면서 Kotlin으로 처음 하는 것이기 때문에 어렵지 않은 주제로 선정하려고 한다


해결

고민한 끝에 노션에 있는 주제 중 하나인 학사 관리 서비스 주제를 선택했다

DB 정규화 관련해 찾아볼 때, 학생 - 수강 과목 관계로 예시를 든 래퍼런스가 많아서 학사 관리 서비스 주제가 무난하다고 생각했다


회고

인프런 워밍업 클럽 BE 스터디 이외에도 개인적으로 하려는 Project가 있기 때문에 놓치는 일정이 생길 때도 있다

일정을 놓치지 않도록 GitHub Project를 이용하고, Kotlin Spring Project와 Java Spring Project 둘 다 잘 마무리 하려고 한다

댓글을 작성해보세요.

채널톡 아이콘