
먼저 C#이란 프로그래밍 "언어" 자체이고,
.NET은 그 C#이라는 언어가 돌아가는 '플랫폼/런타임'이다.
그렇다면 Core이란?
Core은 .NET 플랫폼 위에서 "웹 애플리케이션(웹사이트, API 등)"을 만들기 위한 프레임워크 입니다!
C# (언어)
→ .NET (플랫폼/런타임, 예전엔 .NET Core라고 불림)
→ ASP.NET Core (그 위에서 웹 앱/API 만드는 프레임워크)
짧고, 간단하게 설명하자면 이렇다!
Interface에 대해 알아보자!
먼저 이 예시코드를 보며 이해긔긔!!!
public interface IUserService
{
void CreateUser(string name);
}
public class UserService : IUserService
{
public void CreateUser(string name) { /* 실제 DB 저장 로직 */ }
}
이 클래스는 이런 기능을 반드시 가지고 있어야 한다이다.
이 코드를 보면서 제일 궁금했던 부분은 UserService, IUserService의 사이에 있는 : 이다.
" : "는 쉽게 설명하자면 implements를 의미한다.
상속(inheritance): 부모 클래스의 실제 동작(코드)까지 물려받음
구현(interface/implements): 인터페이스가 정해둔 "규칙(메서드 이름만)"만 따르고, 실제 코드는 직접 다 채워야 함
: 기호를 C#에서는 상속(extends)과 구현(implements) 둘 다에 씁니다. 자바처럼 나눠 쓰지 않아요.
컨트롤러는 IUserService라는 "약속"만 알고 있고,
실제 구현체(UserService)가 뭔지는 몰라도 됩니다. 나중에 UserService를 다른 걸로 바꿔도 컨트롤러 코드는 안 건드려도 돼요. → 이게 DI(의존성 주입)의 기초가 됩니다.
인터페이스는 "이런 메서드가 있어야 한다"고 강제만 하고, 실제로 어떻게 동작할지는 구현하는 클래스가 알아서 채워요 :)
async/await는 시간이 걸리는 작업(DB 조회, API 호출 등)을 기다리는 동안 서버가 놀지 않고 다른 요청을 처리하게 해주는 문법이다.
//예시 소스
public async Task<User> GetUserAsync(int id)
{
var user = await _dbContext.Users.FindAsync(id);
return user;
}
Task는 "User가 나중에 도착할 거야"라는 포장 상자이다.
async: 이 메서드는 비동기로 동작한다고 표시
await는 "DB가 응답 줄 때까지 여기서 기다릴게 근데 기다리는 동안 서버는 다른 손님(요청) 받아도 돼"라는 뜻이다.
한 줄 정의: 컬렉션(List, DB 데이터 등)을 SQL처럼 필터링/조회하는 문법.
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evens = numbers.Where(n => n % 2 == 0); // 짝수만: [2, 4]
var first = numbers.FirstOrDefault(n => n > 3); // 3보다 큰 첫 값: 4
var doubled = numbers.Select(n => n * 2); // 각 값 2배: [2,4,6,8,10]
var user = await _dbContext.Users.FirstOrDefaultAsync(u => u.Email == email);
Where: 조건에 맞는 것만 골라내기(필터링)
FirstOrDefault: 조건에 맞는 첫 번째 값 하나만 가져오기 (없으면 null 또는 기본값 반환)
Select: "검색"이라기보다는 모양을 바꿔서 뽑아내기(변환)
//예시소스
builder.Services.AddScoped<IUserService, UserService>();
// 컨트롤러에서는 그냥 받아서 씀
public class UserController : ControllerBase
{
private readonly IUserService _userService;
public UserController(IUserService userService) {
_userService = userService;
}
}
builder.Services.AddScoped<IUserService, UserService>();
IUserService라는 계약서가 필요할 때는 UserService라는 실제 구현체를 갖다 써라!
AddScoped는 "이 객체를 웹 요청 하나당 1개씩 새로 만들어서 써라"는 규칙(생명주기)을 정하는 것.
public UserController(IUserService userService)
--> "나 IUserService 필요해요!" 라고 요청
이렇게 생성자에 써두기만 해도 ASP.NET Core가 알아서 "아까 등록해둔 UserService를 여기 꽂아줄게"라고 자동으로 넣어준다.
우와 C#은 뭔가 JS같기도 하고 Java같기도 하고 신기하네욤 ㅋ.ㅎ.ㅎ.ㅎ.ㅋ