study/100 days (100일 챌린지)

[웹개발 100일] Day 15 - EF Core Include(), Select() 사용해서 테이블 조인해오기

jihe_ 2025. 2. 28. 23:20
반응형

 

 

 

 

3주차 시작!!

 

3~4주차 일정은 좀 빡셀지도 모르겠다..

API 구현 하나하나 다 하고 기초 보안까지 넣으려면..

흑흑,, 백엔드 그만 보고 싶어염

 

일단 오늘부터 2주간 남은 일

- 페이지별 필요한 API 엔드포인트 구현

- 기초 보안 (JWT, 입력값 검증, 환경 변수 관리)

- 파일 업로드 기능 (오래 걸리면 5~6주차에 이어서 해도 됨)

 

하.. 오늘 테이블 조인해오겠다고 처음 보는 기능 쓰다가 3시간 내내 엔드포인트 하나 짰다.

DB 명명규칙을 카멜 케이스에서 파스칼 케이스로 싹 바꾸느라 마이그레이션도 다시 해줘야 하는데 이건 내일 하는 걸로;;

우우,.. 내일은 바빠서 작업 가능할지 모르겠지만 어쨌든 3주차 화이팅 !!!!

 

 

 


 

🚀 요약

작업 시간: 4시간
✅ DB 명명규칙 파스칼 케이스로 바꾸기
✅ 테이블 조인하는 Service 코드 짜기

 

 


🚀 Include()와 Select() 사용해서 여러 테이블 한 번에 조회하기

 

Event 리스트 가져올 때 User랑 Category 데이터도 항상 같이 필요해서 방법을 찾아보았다.

일단 model과 dto에서 명명규칙을 Pascal Case로 잘 구축해놓으면, 외래키 명시 없이도 Include()에서 자동으로 Id를 사용해 JOIN 해준다는 사실을 알아두자. 예를 들어 UserId는 User 모델의 Id와 자동으로 매칭해준다.

 

 

public User User { get; set; } = new User();
public Category Category { get; set; } = new Category();

Event model에 함께 가져올 모델 추가

 

 

public async Task<IEnumerable<EventDto>> GetAllEventsAsync()
{
    var eventList = await _context.Events
        .Include(e => e.User)  // ✅ EF Core에서 SQL JOIN 실행
        .Include(e => e.Category)
        .Select(e => new EventDto
        {
            Title = e.Title,
            Description = e.Description,
            Date = e.Date,
            CreatedAt = e.CreatedAt,
            User = new UserDto
            {
                Id = e.User.Id,
                Username = e.User.Username,
                ProfileImageUrl = e.User.ProfileImageUrl
            },
            Category = new CategoryDto
            {
                Id = e.Category.Id,
                Name = e.Category.Name
            }
        })
        .ToListAsync();

    return eventList;
}

Select()에서 필요한 컬럼만 DTO에 담아 리스트로 변환

 

 

 

반응형