오픽 IH 5일 독학 합격 후기 | 공부법, 실제 난이도, 시험장 후기 (서울동부자격검정센터)
·
공부/시험
오픽 IH 후기 — 노베이스로 5일 준비했는데 IH 나왔다고등학교 졸업 이후 영어 공부를 거의 안 했다. 그 상태에서 5~6일 준비하고 오픽을 봤는데 결과가 IH 나왔다.솔직히 IM2 예상했는데 IH 떠서 나도 놀랐다. 같은 상황에 있는 사람한테 도움이 될 것 같아서 후기 남긴다.📺 이 영상들이 도움이 많이 됐다공부 시작 전에 이 두 채널 먼저 보는 걸 추천한다. 방향 잡는 데 확실히 도움됐다.👉 강지완 오픽 👉 오픽 노잼 🧠 시작할 때 내 상태시작 전 내 수준은 이랬다.❌ 말하려고 하면 바로 막힘❌ 문장이 잘 안 떠오름❌ 문법 잘 모름✅ 읽기는 됨읽기는 되는데 말은 못하는 상태. 대부분 비슷한 상황일 거라 생각한다.특히 말을 하려고 하면 영어 단어를 한국어처럼 바로 떠올리려는 버릇이 있어서,..
⏰💡 마이페이지 기능 구현
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 왜 이 기능이 필요한가?우리가 만든 서비스는 강의를 신청하는 시스템이다.그렇다면 사용자는 자연스럽게 이런 생각을 한다:“내가 어떤 강의를 신청했지?”“신청 상태는 뭐지?”“다시 확인하고 싶은데 어디서 보지?”👉 그래서 필요한 기능이 바로“내 신청 내역 (마이페이지)” 이다.2️⃣ 전체 흐름 먼저 이해하기 (중요🔥)이 기능은 단순히 DB 조회가 아니라 전체 흐름을 이해하는 게 핵심이다.[사용자] ↓ 클릭"내 강의장" 버튼 ↓/me 페이지 이동 ↓JS가 API 호출(GET /api/me/enrollments) ↓Controller ↓Service ↓Repository (DB 조회) ↓DTO 변환 ↓JSON 응답 ↓화면에 카드로 렌더링👉 초보자 기준 핵심 포인트:화..
⏰💡 관리자 기능 + UI (JWT Role기반)
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 내가 만들고 싶은 최종 결과사용자는 보통 /lectures(로비)에서 시작해요.누구나 /lectures에서 강의 목록을 구경할 수 있음로그인하면:일반 USER는 “내 강의장” 버튼이 보임(나중에 마이페이지용)ADMIN은 “내 강의장” 대신 “관리자 페이지” 버튼이 보임 → /admin/lectures로 이동/admin/lectures에서는 운영자가강의 생성강의 목록 확인강의 마감 처리(CLOSED)신청자 목록 조회를 할 수 있음그리고 가장 중요한 것!✅ 버튼을 숨긴다고 보안이 되는 건 아니고, 서버에서 /api/admin/**를 ADMIN만 통과시키는 것이 진짜 보안이에요.2️⃣ 현재 프로젝트 구조 (핵심만)config/WebOAuthSecurityConfig (보안 설정)TokenProvider..
⏰💡 오픈 시간(openAt) 전에는 신청 버튼 막기 + 카운트다운 표시
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 왜 이 기능을 만들었을까?선착순 강의 신청 시스템을 만들면서 가장 중요한 포인트는 하나였다.👉 “정각에만 신청 가능해야 한다”예를 들어:강의 오픈: 10:00그런데 9:59에 신청 가능?👉 이건 선착순이 아니라 그냥 아무 때나 신청 가능한 시스템이다.그래서 우리는 반드시:❌ 오픈 전 → 신청 불가✅ 오픈 후 → 신청 가능이걸 정확하게 구현해야 했다.2️⃣ 전체 구조 먼저 이해하기내 프로젝트 흐름은 이렇게 되어 있다:lobby.html → 강의 목록detail.html → 신청 버튼 (대기열 등록)/api/lectures/{id}/queue → 대기열 등록 APIapply.html → 입장권 받은 사람만 결제/api/lectures/{id}/enroll → 최종 신청👉 여기서 핵심은:“신청 버..
⏰🚨 “입장권이 있는데도 apply 페이지에서 입장권 없음 오류 발생”
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 문제 상황Spring Boot + JWT + Redis 기반 선착순 시스템을 구현하는 중,다음과 같은 문제가 발생했다.👉 대기열을 통과해서 입장권(ADMITTED)을 정상적으로 받은 상태인데도/lectures/1/apply페이지에 들어가면 아래 메시지가 출력됨:"입장권이 없습니다. 상세 페이지에서 대기열부터 진행해주세요."📌 이상한 점Postman으로 확인했을 때는 정상이었다.✅ API 결과GET /api/lectures/1/queue/me{ "status":"ADMITTED", "lectureId":1}👉 즉, 서버에서는 분명히 입장권이 있다고 판단하고 있음그런데 프론트에서는 “입장권 없음”이 뜨는 이상한 상황이었다.2️⃣ 원인 분석문제는 상태 값 통일 과정에서 발생한 프론트-백 불일치..
⏰🚨 선착순 강의 신청에서 “이미 신청했는데 다시 신청 가능?” 문제 해결
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 문제 상황Spring Boot + Redis 기반 선착순 강의 신청 시스템을 구현하던 중,다음과 같은 문제가 발생했다.❗ 문제 증상사용자가 이미 강의를 신청한 상태다시 상세 페이지(/lectures/{id})에 진입"신청하기" 버튼 클릭👉 결과:❌ "대기열 정보가 없습니다. 다시 신청하기 버튼을 눌러주세요."❌ 다시 대기열 진입 가능❌ 결제 페이지까지 다시 이동 가능👉 정상이라면?"이미 신청한 강의입니다."버튼은 "신청 완료" 상태여야 함2️⃣ 원인 분석1. 백엔드는 이미 정상Postman으로 확인:GET /api/lectures/1/enroll/me응답:{ "status":"ENROLLED", "lectureId":1, "lectureTitle":"Redis 기반 대규모 선착순 수강신청..
⏰💡 선착순 강의 Redis 대기열(ZSET) + 입장권 원자화 + 소비(consume) 적용하기 (Lua 1개로 끝)
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
선착순 시스템은 “기능이 동작한다”와 “실무에서 안전하다”가 다릅니다.특히 동시에 많은 요청이 몰리면 다음 문제들이 자주 발생합니다.대기열에서 뽑힌 사람(POP)이 입장권(admitted) 을 못 받거나(서버 다운/중간 실패)스케줄러가 여러 인스턴스에서 실행되면 중복 발급/누락이 생기거나사용자가 신청 버튼을 연타하면 중복 신청/경쟁 조건이 생기거나이번 글에서는 이 문제를 해결하기 위해 아래 2가지를 적용했습니다. ✅ 목표입장권 발급(pop + grant)을 원자적으로 처리하기신청(apply) 시 입장권을 먼저 소비(consume)해서 중복 요청을 막기1️⃣ 기존 구조와 문제점기존 대기열/입장권 구조대기열: Redis ZSETkey: queue:lecture:{lectureId}member: userIds..
⏰🚨 선착순 강의 신청 페이지에서 버튼이 동작하지 않던 문제 해결
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 문제 상황소셜 로그인 + JWT 기반 인증을 적용한 후,선착순 강의 시스템의 강의 상세 페이지(/lectures/{id}) 에서“신청하기” 버튼을 눌러도 아무 반응이 없는 문제가 발생했다.정상 동작 흐름 (의도한 동작)로그인 후 강의 상세 페이지 진입“신청하기” 버튼 클릭대기열 등록 API 호출폴링으로 순번 확인입장 가능(SUCCESS) 시 결제 페이지 이동하지만 실제로는:❌ 버튼 클릭 시 화면 변화 없음❌ 네트워크 요청 없음❌ 오류 메시지도 없음2️⃣ 원인 분석문제의 핵심은 버튼이 아니라 JavaScript 실행 자체가 중단된 것이었다.✔️ 핵심 원인 1 : Token is not defined 에러브라우저 콘솔에 다음 오류가 발생했다 :Uncaught ReferenceError: Token i..
⏰💡 소셜 로그인 + 선착순 강의 신청 시스템 통합 (JWT 기반 userId 전환)
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
📌 개요기존 강의 신청 시스템은 사용자를 식별하기 위해 UUID 기반 userKey를 프론트에서 생성하고 전달하는 구조였다.하지만 이 방식은 보안·유지보수·확장성 측면에서 문제가 많았다.그래서 다음과 같은 목표로 시스템을 전면 개선했다.🎯 목표✅ 목표 1 — userKey(UUID) 제거프론트에서 임의 UUID 생성 및 전달 구조 제거API에서 ?userKey=... 파라미터 사용 중단✅ 목표 2 — JWT 기반 사용자 식별로그인된 사용자 정보를 서버가 JWT에서 직접 추출userId(Long)를 기준으로 Redis / DB 처리✅ 목표 3 — 소셜 로그인 → 강의 신청 흐름 통합OAuth2 로그인 성공 시 JWT 발급자동으로 강의 목록(/lectures) 페이지 이동1️⃣ 변경 전 vs 변경 후 전..
⏰🚨 동시성 테스트 중 500 Internal Server Error 발생 원인과 해결
·
프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트
1️⃣ 문제 상황JMeter로 동시 사용자 300명 / 500명 환경에서 Enroll(신청) API 동시성 테스트를 진행하던 중, 03_enroll 요청이 빨간색으로 표시되며 다음과 같은 응답이 발생했다.{ "timestamp": "2026-02-14T07:10:23.474+00:00", "status": 500, "error": "Internal Server Error", "path": "/api/lectures/1/enroll"}IntelliJ 서버 로그에는 다음과 같은 예외가 출력되었다.java.lang.IllegalStateException: 정원이 마감되었습니다. at studying.blog.service.EnrollService.enroll(EnrollService.java:37)2️..