[2주차] 인프런 워밍웝 클럽 Backend
인프런 워밍업 클럽 스터디 3기 -백엔드 프로젝트(Kotlin) 2주차 발자국 입니다.
강의내용 간단한 정리
데이터베이스 초기화
애플리케이션이 시작될 때 필요한 기본 데이터를 DB에 미리 삽입하는 역할을 합니다
@Component
@Profile(value = ["default"])
class DataInitializer(
private val achievementRepository: AchievementRepository,
private val introductionRepository: IntroductionRepository,
private val linkRepository: LinkRepository,
private val skillRepository: SkillRepository,
private val projectRepository: ProjectRepository,
private val experienceRepository: ExperienceRepository
) {@Profile : 환경변수 설정을 정할 수 있다.
@Component : Bean Configuration 파일에 Bean을 따로 등록하지 않도록 도와준다.
리포지토리 개발
스프링에서 제공하는 Spring Data JPA를 사용하면, 인터페이스 상속만으로 기본적인 CRUD 기능을 사용할 수 있다.
도메인에 종속되는 기능이라도 메소드명 네이밍 규칙을 따르면 그에 맞는 쿼리를 자동으로 생성해주기도 합니다.
//select * from skill where name : name and skill_type = :type
fun findByNameIgnoreCaseAndType(name: String, type: SkillType):Optional<Skill> @Query("select e from Experience e left join fetch e.details where e.id = :id")
override fun findById(id: Long): Optional<Experience>
}@Query : SQL과 유사한 JPQL (Java Persistence Query Language) 라는 객체지향 쿼리 언어를 통해 복잡한 쿼리 처리를 지원합니다.
N+1문제
JPA를 사용할 때, 연관된 엔티티를 조회할 때 추가적인 쿼리가 다량으로 발생하는 문제를 N+1 문제라고 합니다.
먼저 부모 테이블에서 조회를 한 후, 엔 티티의 연관관계를 바탕으로 조회해온 데이터의 개수만큼 부모에 매핑된 자식 테이블의 데이터를 조회하기 위해 데이터베이스를 호출합니다.
해결방법으로는 FetchType은 Eager을 사용하거니 default_batch_fetch_size: 10 사이즈를 조절해서 해결하는 방법이 있다.
@Query 를 사용하여 JOIN FETCH을 사용함으로써 해결 할 수 있다.
DTO개발
엔티티(Entity) 자체를 노출하는 대신, 필요한 데이터만 전달합니다.
엔티티 그대로 노출 시 불필요한 데이터까지 포함될 위험이 있습니다.
필요 없는 필드를 제외하여 네트워크 트래픽 감소시킬 수 있습니다.
data class AchievementDTO(
val title: String,
val description: String,
val host: String,
val achievedDate: String?
)
컨트롤러 개발
@Controller 와 @RestController 를 사용할 수 있다.
@Controller는 웹 페이지를 반환 할 때 사용하고, @RestController는 데이터를 반환할 경우 사용한다.
@GetMapping Get매소드를 알려준다.
회고
회사 다니면서 피곤하다는 핑계로 조금씩 미루다 보니, 어느새 강의만 겨우 따라가는 수준이 되어버렸다. 처음엔 하루만 쉬자는 생각이었는데, 점점 습관처럼 미루게 됐다. 결국 복습도 부족했고, 깊이 있는 공부를 할 시간도 없었다.
다음 주는 미루기보다는 바로바로 시작을 해야겠다. 미루기보다는 바로 실행하고 공부를 조금씩이라도 더 해야겠다.
댓글을 작성해보세요.