LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

프론트엔드 스터디 대면 8주차: API와 통신 — 프론트엔드와 백엔드의 계약

2026년 6월 28일·15분 읽기
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
사용자
  -> 브라우저에서 버튼 클릭
  -> 프론트엔드가 서버에 요청
  -> 백엔드가 데이터베이스와 비즈니스 규칙 확인
  -> 백엔드가 응답
  -> 프론트엔드가 응답을 화면으로 변환
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
const studies = await getStudies();
Paragraph fallback
Paragraph component omitted
text
1. 요청 URL 만들기
2. HTTP 메서드 결정하기
3. 헤더와 body 구성하기
4. 브라우저가 요청 보내기
5. 서버가 응답하기
6. 브라우저가 CORS 등 보안 규칙 확인하기
7. JSON 파싱하기
8. 성공/실패에 따라 UI 상태 바꾸기
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
GET /api/studies?page=1&size=20 HTTP/1.1
Host: example.com
Accept: application/json
http
HTTP/1.1 200 OK
Content-Type: application/json

{
  "items": [],
  "page": 1,
  "totalCount": 0
}
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
메서드보통의 의미예시
GET데이터 조회스터디 목록 조회
POST데이터 생성 또는 명령 실행스터디 신청
PUT전체 교체프로필 전체 수정
PATCH일부 수정닉네임만 수정
DELETE삭제댓글 삭제
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
상태 코드의미프론트엔드에서 자주 하는 처리
200성공데이터 표시
201생성 성공생성 완료 후 상세/목록 이동
204성공했지만 body 없음삭제 완료 처리
400잘못된 요청입력값 확인 메시지
401인증 필요로그인 화면 이동 또는 토큰 갱신
403권한 없음접근 불가 안내
404대상 없음not found 화면 또는 빈 상태
409충돌이미 신청됨, 이미 사용 중인 이름 등
500서버 오류잠시 후 다시 시도 안내
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
GET /api/me HTTP/1.1
Authorization: Bearer access-token
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
GET /api/studies?page=1&size=20
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
json
{
  "items": [
    {
      "id": 1,
      "title": "프론트엔드 스터디",
      "status": "OPEN",
      "currentMemberCount": 12,
      "maxMemberCount": 20
    }
  ],
  "page": 1,
  "size": 20,
  "totalCount": 42
}
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
json
{
  "title": "프론트엔드 스터디",
  "description": "API와 통신을 공부합니다.",
  "maxMemberCount": 20
}
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
json
{
  "code": "STUDY_ALREADY_CLOSED",
  "message": "이미 마감된 스터디입니다.",
  "fieldErrors": []
}
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
json
{
  "code": "VALIDATION_ERROR",
  "message": "입력값을 확인해주세요.",
  "fieldErrors": [
    {
      "field": "title",
      "message": "제목은 필수입니다."
    }
  ]
}
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
검색 결과 없음        -> 200 OK + items: []
아직 작성한 글 없음   -> 200 OK + items: []
존재하지 않는 글       -> 404 Not Found
권한이 없어 볼 수 없음 -> 403 Forbidden
로그인이 필요함       -> 401 Unauthorized
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
GET /api/posts?page=3&size=20
Paragraph fallback
Paragraph component omitted
http
GET /api/posts?offset=40&limit=20
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
text
처음 요청 시점
[100, 99, 98, ... 81]  -> 1페이지에서 봄
[80, 79, 78, ... 61]   -> 다음에 볼 예정

그 사이 새 글 3개 추가
[103, 102, 101, 100, 99, 98, ...]

offset=20으로 다음 요청
원래 기대: 80부터
실제 결과: 83부터 시작할 수 있음
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
GET /api/posts?cursor=81&limit=20
Paragraph fallback
Paragraph component omitted
json
{
  "items": [],
  "nextCursor": "eyJpZCI6MTAwfQ==",
  "hasNext": true
}
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
https://example.com:443/posts/1?tab=comment
└────┬────┘ └────┬────┘ └┬┘
  protocol      host    port

Origin = https://example.com:443
Paragraph fallback
Paragraph component omitted
text
https://example.com/posts
https://example.com/api/studies
Paragraph fallback
Paragraph component omitted
text
http://localhost:5173
http://localhost:8080

https://example.com
https://api.example.com

http://example.com
https://example.com
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
text
프론트 코드: fetch("http://localhost:8080/api/studies")
브라우저: 요청은 보냄
서버: 응답은 보냄
브라우저: 응답 헤더 확인
브라우저: 허용되지 않은 Origin이면 JS 코드에 응답을 넘기지 않음
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
http
Origin: http://localhost:5173
Access-Control-Allow-Origin: http://localhost:5173
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
서버 관점: 요청 받음 -> 응답 보냄 -> 200 OK
브라우저 관점: 응답 받음 -> CORS 헤더 확인 실패 -> JS에 응답 전달 차단
프론트 관점: fetch 실패처럼 보임
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
OPTIONS /api/studies HTTP/1.1
Origin: http://localhost:5173
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type, authorization
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://localhost:5173
Access-Control-Allow-Methods: GET, POST, PATCH, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 600
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted

Content-Type: application/json으로 POST/PATCH를 보내는 경우 Authorization 헤더를 붙이는 경우 커스텀 헤더를 붙이는 경우 PUT, PATCH, DELETE 같은 메서드를 쓰는 경우 쿠키나 인증 정보를 포함하는 요청을 보내는 경우

Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
await fetch("https://api.example.com/me", {
  credentials: "include",
});
http
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Credentials: true
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
http
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST, PATCH, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Paragraph fallback
Paragraph component omitted
ts
// NestJS 예시
app.enableCors({
  origin: ["http://localhost:5173", "https://www.example.com"],
  credentials: true,
});
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
// vite.config.ts
export default defineConfig({
  server: {
    proxy: {
      "/api": {
        target: "http://localhost:8080",
        changeOrigin: true,
      },
    },
  },
});
ts
// 브라우저에서는 같은 출처로 요청하는 것처럼 보인다.
await fetch("/api/studies");
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

개발 환경에서 CORS 설정 때문에 막히지 않고 빠르게 화면 개발을 진행할 수 있습니다. 프론트 코드의 API base URL을 /api처럼 단순하게 유지할 수 있습니다. 로컬 개발 환경과 운영 환경의 URL 차이를 설정으로 흡수할 수 있습니다.

Paragraph fallback
Paragraph component omitted

개발 서버 프록시는 보통 로컬 개발용입니다. 운영 CORS 정책을 대신 설계하지 않습니다. 프록시 설정이 운영 배포 구조와 다르면 로컬에서는 되는데 운영에서는 깨질 수 있습니다. 인증 쿠키, 도메인, SameSite, HTTPS 조건이 얽히면 프록시만으로 문제를 해결할 수 없습니다.

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
브라우저
  -> https://www.example.com/api/studies
  -> Nginx 또는 API Gateway
  -> 내부 백엔드 서버
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
1. 브라우저 Network 탭에서 실패한 요청을 연다.
2. Request Headers의 Origin을 확인한다.
3. Response Headers의 Access-Control-Allow-Origin을 확인한다.
4. OPTIONS 요청이 있는지 확인한다.
5. OPTIONS 응답에 Allow-Methods, Allow-Headers가 있는지 확인한다.
6. 쿠키 요청이면 credentials와 Allow-Credentials를 확인한다.
7. 서버 로그에는 성공인데 브라우저만 막는 상황인지 확인한다.
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
AJAX 이전: 요청 -> 새 HTML 전체 다운로드 -> 페이지 전체 교체
AJAX 이후: 요청 -> JSON 데이터 다운로드 -> 필요한 UI만 갱신
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
js
getUser(userId, function (user) {
  getOrders(user.id, function (orders) {
    getOrderDetail(orders[0].id, function (orderDetail) {
      // 계속 중첩됨
    });
  });
});
Paragraph fallback
Paragraph component omitted
ts
async function loadUserOrderInfo(userId: number) {
  try {
    const user = await getUser(userId);
    const orders = await getOrders(user.id);
    const orderDetail = await getOrderDetail(orders[0].id);
    return orderDetail;
  } catch (error) {
    console.error("요청 실패", error);
  }
}
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
const response = await fetch("/api/users");
const data = await response.json();
Paragraph fallback
Paragraph component omitted

404, 500 같은 HTTP 에러가 자동으로 catch로 가지 않습니다. JSON 변환을 매번 response.json()으로 직접 해야 합니다. timeout, 공통 헤더, 인터셉터 같은 기능을 직접 만들어야 합니다. 요청 취소는 AbortController를 알아야 합니다.

ts
const response = await fetch("/api/users");

if (!response.ok) {
  throw new Error("HTTP error");
}

const data = await response.json();
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
const response = await axios.get("/api/users");
const data = response.data;
Paragraph fallback
Paragraph component omitted
ts
try {
  const response = await axios.get("/api/users");
  console.log(response.data);
} catch (error) {
  if (axios.isAxiosError(error) && error.response) {
    console.log(error.response.status);
    console.log(error.response.data);
  }
}
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
const apiClient = axios.create({
  baseURL: "/api",
  timeout: 10000,
  withCredentials: true,
});
Paragraph fallback
Paragraph component omitted
ts
export async function getStudies(params: GetStudiesParams) {
  const response = await apiClient.get<StudyListResponse>("/studies", {
    params,
  });

  return response.data;
}
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
apiClient.interceptors.request.use((config) => {
  // 학습을 위한 단순 예시입니다.
  // localStorage에 토큰을 저장하면 XSS 공격에 노출될 수 있습니다.
  const token = localStorage.getItem("accessToken");

  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }

  return config;
});
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
로그인 성공
  -> Access Token 발급: 짧은 수명, API 요청에 사용
  -> Refresh Token 발급: 긴 수명, Access Token 재발급에 사용
Paragraph fallback
Paragraph component omitted
http
Authorization: Bearer {accessToken}
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
요청 A, B, C가 동시에 401을 받음
  -> refresh 요청을 세 번 보내면 위험
  -> 하나의 refresh만 진행하고 나머지는 그 결과를 기다리게 설계
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
ts
await fetch("https://api.example.com/me", {
  credentials: "include",
});
http
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Credentials: true
Set-Cookie: refreshToken=...; HttpOnly; Secure; SameSite=None
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
tsx
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);

useEffect(() => {
  setLoading(true);
  axios
    .get("/api/users")
    .then((response) => setUsers(response.data))
    .catch((error) => setError(error))
    .finally(() => setLoading(false));
}, []);
Paragraph fallback
Paragraph component omitted
tsx
const { data, isLoading, error } = useQuery({
  queryKey: ["users"],
  queryFn: () => apiClient.get("/users").then((res) => res.data),
  staleTime: 5 * 60 * 1000,
});
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
구분QueryMutation
용도데이터 읽기데이터 생성/수정/삭제
주로 쓰는 HTTPGETPOST, PUT, PATCH, DELETE
실행 시점컴포넌트 마운트 시 자동mutate 호출 시 수동
캐싱자동 캐싱직접 무효화/갱신 필요
tsx
const queryClient = useQueryClient();

const createStudy = useMutation({
  mutationFn: (newStudy) => studyApi.createStudy(newStudy),
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ["studies"] });
  },
});
Paragraph fallback
Paragraph component omitted
Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
ts
["studies", "list", { status: "OPEN", page: 1 }][("studies", "detail", 123)];
Paragraph fallback
Paragraph component omitted
ts
export const studyQueries = {
  all: ["studies"] as const,
  lists: () => [...studyQueries.all, "list"] as const,
  list: (params: GetStudiesParams) =>
    [...studyQueries.lists(), params] as const,
  detail: (studyId: number) =>
    [...studyQueries.all, "detail", studyId] as const,
};

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
text
src/
  api/
    client.ts
    studies.ts
  pages/
    StudyListPage.tsx
  components/
    StudyCard.tsx
Paragraph fallback
Paragraph component omitted
ts
// api/studies.ts
export async function getStudies(params: GetStudiesParams) {
  const response = await apiClient.get<StudyListResponse>("/studies", {
    params,
  });

  return response.data;
}
Paragraph fallback
Paragraph component omitted
text
src/
  shared/
    api/
      httpClient.ts
      apiError.ts
  features/
    studies/
      api/
        studyApi.ts
        studyQueries.ts
      model/
        studyTypes.ts
        studyPolicy.ts
      ui/
        StudyCard.tsx
        StudyList.tsx
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
text
스터디 목록 화면에서 모집 중/마감 상태에 따라 버튼이 달라집니다.
응답에 status 필드를 OPEN/CLOSED 형태로 받을 수 있을까요?
빈 목록일 때는 items: []와 totalCount: 0으로 내려오는지 확인 부탁드립니다.
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

이 API는 로그인하지 않은 사용자도 호출할 수 있나요? 실패할 때 code 값은 어떤 목록 중 하나인가요? 빈 목록은 200과 빈 배열인가요, 아니면 404인가요? 페이지 번호는 0부터 시작하나요, 1부터 시작하나요? 정렬 기본값은 무엇인가요? 검색어가 비어 있으면 전체 목록인가요, 빈 목록인가요? 삭제 성공 시 200인가요, 204인가요? 401과 403을 어떻게 구분하나요? refresh token 만료 시 어떤 응답이 오나요? CORS 허용 Origin에 로컬 개발 주소와 배포 주소가 모두 들어가 있나요? 쿠키 인증이라면 credentials, SameSite, Secure, CSRF 정책은 어떻게 맞추나요?

Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

---

Subtitle fallback
Subtitle component omitted
Paragraph fallback
Paragraph component omitted
Paragraph fallback
Paragraph component omitted

Post Q&A

오케이징에게 물어보기

프론트엔드 스터디 대면 8주차: API와 통신 — 프론트엔드와 백엔드의 계약 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/study/clab-26-1/in-person
파일 9개, 폴더 0개
프론트엔드 스터디 대면 0주차: 프론트엔드 개발자란? 그리고 우리가 배울 것들프론트엔드 스터디 대면 1주차: HTML 마크업과 폼, 그리고 CSS의 시작프론트엔드 스터디 대면 2주차: 폼(Form), CSS 선택자, 그리고 박스 모델프론트엔드 스터디 대면 3주차: 박스 모델 실전, Position과 Flexbox프론트엔드 스터디 대면 6주차(1): HTML/CSS/JS 리마인드와 브라우저 렌더링프론트엔드 스터디 대면 6주차(2): AI 시대의 개발 방식과 프론트엔드 개발자의 위치프론트엔드 스터디 대면 7주차: React 입문과 프로젝트 구조프론트엔드 스터디 대면 8주차: API와 통신 — 프론트엔드와 백엔드의 계약프론트엔드 스터디 대면 9주차: Next.js 렌더링 진화와 웹 퍼포먼스

같은 섹션의 대표 이미지

9 posts · latest first
Study26. 05. 25.

프론트엔드 스터디 대면 9주차: Next.js 렌더링 진화와 웹.

Next.js가 무엇이고 왜 필요한지 React와 비교해 이해한 뒤, CSR부터 SSR, SSG, ISR, PPR까지 렌더링 전략과 Web Vitals를 정리하며 스터디를 마무리합니다.

26. 05. 25.SEOJing
Study26. 05. 18.

프론트엔드 스터디 대면 8주차: API와 통신 — 프론트엔드와.

비동기와 async/await를 배운 뒤, 대면에서는 API를 단순 호출 방법이 아니라 프론트엔드와 백엔드 사이의 계약으로 바라봅니다. HTTP, REST, CORS, 프록시, API 클라이언트 구조, TanStack Query와 파일 배치까지 연결합니다.

26. 05. 18.SEOJing
Study26. 05. 11.

프론트엔드 스터디 대면 7주차: React 입문과 프로젝트 구조.

바닐라 JS의 한계에서 React가 등장한 이유까지, 컴포넌트와 렌더링 방식을 이해하고 프로젝트 구조 감각을 만들어가는 대면입니다.

26. 05. 11.SEOJing
Study26. 05. 04.

프론트엔드 스터디 대면 6주차(1): HTML/CSS/JS.

4~6주차 공백 이후 진행하는 첫 번째 대면입니다. HTML/CSS/JS 핵심을 가볍게 다시 연결하고, 브라우저가 코드를 실제 화면으로 바꾸는 과정을 통해 렌더링 파이프라인과 성능 감각을 잡습니다.

26. 05. 04.SEOJing
Study26. 05. 04.

프론트엔드 스터디 대면 6주차(2): AI 시대의 개발 방식과.

길어진 6주차 대면의 두 번째 차시입니다. AI 시대에 개발자가 실제로 어떻게 일하는지, 그리고 프론트엔드 개발자가 디자이너·백엔드·PM 사이에서 어떤 연결과 리딩 역할을 하는지 다룹니다.

26. 05. 04.SEOJing
Study26. 04. 10.

프론트엔드 스터디 대면 3주차: 박스 모델 실전,.

3주차 박스 모델과 스타일링 복습, 과제 풀이, 4주차 Position과 Flexbox 레이아웃까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 마진 겹침, box-sizing, Flexbox 관련 질문도 함께 준비합니다.

26. 04. 10.SEOJing
Study26. 04. 03.

프론트엔드 스터디 대면 2주차: 폼(Form), CSS.

2주차 폼과 CSS 선택자 복습, 과제 풀이, 3주차 박스 모델과 스타일링까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 GET vs POST, CSS 우선순위, 박스 모델 관련 질문도 함께 준비합니다.

26. 04. 03.SEOJing
Study26. 03. 27.

프론트엔드 스터디 대면 1주차: HTML 마크업과 폼, 그리고.

1주차 HTML 핵심 복습과 과제 풀이, 2주차 폼(Form)과 CSS 선택자까지 다룬 대면 스터디 정리입니다. 면접에서 자주 나오는 시맨틱 HTML, img alt 속성 관련 질문도 함께 준비합니다.

26. 03. 27.SEOJing
Study26. 03. 20.

프론트엔드 스터디 대면 0주차: 프론트엔드 개발자란? 그리고.

프론트엔드 개발자가 실무에서 하는 일, 2025-2026 기술 스택, 현실적인 연봉과 채용 트렌드를 정리했습니다. 스터디 자료 구조와 앞으로의 방향도 함께 안내합니다.

26. 03. 20.SEOJing