✅ 56일차 월요일(05/19)
- 3차 미니 프로젝트로 AWS 클라우드 과제를 진행했다.
- 자세한 내용은 👉 이곳에서 확인
✅ 57일차 화요일(05/20) ~ 59일차 목요일 (05/23)
- Spring이 도대체 뭐지? 🤔
웹 백엔드, MSA, HTTP 수업 내용을 핵심만 요약해서 정리해봤어요. - 백엔드에 관심은 있지만 처음 접하다 보니, 낯선 전문 용어가 많았어요.
그래서 중요하다고 생각한 부분만 골라서 다시 정리해봤습니다. (그런데 중요한 용어가 너무 많네요 🤣🤣)
🌱 Spring이란?
Spring은 자바 기반의 웹 애플리케이션 프레임워크로, 복잡한 설정 없이 쉽게 개발할 수 있게 도와줘요!
특히 의존성 주입(DI) 과 제어의 역전(IoC) 을 통해 객체 관리와 코드 구조를 깔끔하게 만들어줍니다.
🍳 Spring은 자동화된 부엌이다?!
예를 들면 Spring은 자바 개발자들을 위한 ‘자동화된 부엌’ 같은 거예요.
원래는 요리(개발)하려면 🔥 불도 켜고, 🧅 재료도 꺼내고, 🍲 냄비도 올리고 다 직접 해야 했는데, Spring은 버튼 몇 번만 누르면 자동으로 재료 준비하고 요리까지 도와주는 시스템이에요.
덕분에 개발자는 복잡한 설정 말고 📜 ‘요리 레시피(핵심 로직)’ 에만 집중하면 돼요!
🌐 Web? 그거 그냥 인터넷 아니야? (feat. HTTP & 친구들)
- Web은 쉽게 말해 웹은 문서를 주고받는 거대한 서비스예요.
- 이 서비스의 핵심 규칙이 바로 HTTP(HyperText Transfer Protocol)라는 약속이죠. 마치 우리가 대화할 때 한국어를 쓰듯, 클라이언트(우리 컴퓨터)와 서버(정보 창고)는 HTTP로 대화해요.
- 클라이언트-서버: 우리가 브라우저에 "야, 네이버 보여줘!" 💻 (요청) 하면, 네이버 서버가 "여기 있어!" 짠! ✨ (응답) 하고 화면을 보내주는 거죠.
- HTTP: 이 "보여줘!"와 "여기 있어!" 같은 대화 규칙이에요.
- GET: "이거 좀 줘!" (데이터 요청)
- POST: "새 글 올릴게!" (새 데이터 생성)
- PUT/PATCH: "아까 그거 고칠게!" (데이터 수정)
- DELETE: "이거 지워줘!" (데이터 삭제)
- TCP/IP: 이 대화를 안전하고 정확하게 배달해주는 우체국 시스템 📮 같아요.
- 편지(데이터)를 주소(IP)와 방 번호(포트)에 맞게, 안전하게(TCP) 또는 빠르게(UDP) 배달해 주죠. 웹은 주로 안전 배송 TCP를 선호해요!
- REST API: 요즘 웹 개발의 '국룰'! 예전엔 서버가 HTML 페이지 전체를 만들어줬다면, 이젠 "데이터만 줘! 꾸미는 건 내가 할게!" 🎨 방식이에요. 서버는 깔끔하게 JSON이라는 데이터 뭉치만 던져주죠.
🚨 HTTP 상태 코드
- 200번대: 좋았쓰! 👍 (요청 성공!)
- 400번대: 니 잘못이야! 😠 (클라이언트 요청 문제)
- 500번대: 나 망했으 ㅠㅠ 😭 (서버 문제)
- 핵심 요약: 웹은 HTTP라는 약속 위에 세워진 왕국이고, 우리는 REST API라는 현대적인 방식으로 소통해요!
🎭 웹은 한 편의 연극! (feat. Ajax, CSR, SSR)
웹 페이지가 우리 눈에 보이는 건 연극 무대와 같아요. 화려한 무대(클라이언트) 뒤에는 바쁘게 돌아가는 대본(서버)과 소품 창고(DB)가 있죠. 웹이 돌아가는 방식도 이와 비슷해요!
- 🛠️ Ajax (에이잭스) - 몰래 수리공: 연극 도중에 무대 전체를 바꾸지 않고, 배우가 몰래 소품 하나만 쓱 바꿔치기하는 것! 페이지 전체를 새로고침 안 하고 댓글만 싹~ 바뀌는 게 바로 Ajax 덕분이에요.
- 🎨 CSR (Client-Side Rendering) - 클라이언트가 주인공: 텅 빈 무대(빈 HTML)만 주고, 배우(자바스크립트)가 관객(브라우저) 앞에서 직접 무대를 꾸미는 방식! 처음엔 좀 느리지만, 일단 꾸며지면 반응이 빠릿해요.
- 🧙 SSR (Server-Side Rendering) - 서버가 다 해줌: 무대 뒤에서 이미 완벽하게 꾸며진 무대(완성된 HTML)를 통째로 내보내는 방식! 관객은 바로 완성된 장면을 볼 수 있죠. 처음 로딩이 빠르고 검색 엔진이 좋아해요, 대신 서버가 좀 바쁘겠죠?
🧱 웹은 3층짜리 건물! (3-Tier Architecture)
웹 서비스는 보통 이렇게 3층짜리 건물처럼 지어져요.
- 1층: 클라이언트 🧑💻 - 우리가 직접 보는 화면 (브라우저, 앱)
- 2층: 웹/앱 서버 ⚙️ - 모든 일 처리 담당 (바로 여기에 스프링이 살아요!)
- 3층: 데이터베이스 서버 💾 - 진짜 데이터 창고 (MySQL, MongoDB 등)
이 세 층이 쿵짝쿵짝 잘 협력해야 우리가 사용하는 서비스가 탄생하는 거죠.
🌱 그래서, 다시 한번 스프링이 대체 뭐라고? + 핵심 개념 파헤치기
- 스프링(Spring) = 개발자의 만능 비서 + 집사 + 매니저 🤵 라고 생각하면 쉬워요.
우리가 직접 객체를 만들고, 연결하고, 관리하는 귀찮은 일들을 "제가 다 알아서 해드릴게요!" 하고 나서는 든든한 친구죠.
- 1. POJO (Plain Old Java Object) — 그냥 평범한 자바 친구: 스프링은 깐깐하지 않아요. 특별한 옷(상속)을 입지 않은, 평범한 자바 클래스(객체)를 제일 좋아해요. 단순해서 여기저기 쓰기 좋거든요!
- 2. IoC (Inversion of Control) — 택시 타! 내가 운전 안 해도 돼: 원래는 내가 직접 차(객체)를 몰고(만들고) 목적지(사용)까지 가야 했죠? IoC는 "택시 타! 목적지만 말해!" 🚕 예요. 운전(객체 생성, 관리)은 택시 기사(스프링)가 알아서 해주고, 우린 편하게 앉아 있기만 하면 돼요. 이걸 '제어의 역전'이라고 불러요.
- 3. DI (Dependency Injection) — 셰프님이 재료는 다 챙겨줌: 요리(개발)를 하려면 재료(다른 객체)가 필요하죠? DI는 "필요한 재료는 셰프(스프링)가 알아서 꽂아줄게!" 예요. 내가 마트에 가서 재료를 사 올(new) 필요 없이, 스프링이 알아서 필요한 곳에 쏙쏙 넣어주는 거죠. 덕분에 재료가 바뀌어도 요리법(코드)을 크게 바꿀 필요가 없어져요! (느슨한 결합 👍)
- 4. AOP (Aspect Oriented Programming) — 햄버거 토핑은 내가 뿌릴게: 햄버거 🍔 를 만들 때 패티 굽는 건 핵심이지만, 피클/케첩/치즈를 넣는 건 모든 햄버거에 비슷하게 들어가죠? AOP는 로그 기록, 보안 체크, 시간 측정처럼 여기저기 반복되는 '공통 관심사(토핑)'를 핵심 로직과 분리해서, 스프링이 알아서 척척 처리해주는 기술이에요. 우린 핵심 로직(패티 굽기)에만 집중할 수 있죠!
- 5. 경량 컨테이너 — 객체들의 마법 성: 스프링은 이 모든 객체(Bean)들을 만들고, 관리하고, 필요한 곳에 넣어주는 거대한 '성(Container)' 🏰 을 가지고 있어요. 이 성 안에서 객체들은 주로 하나만 만들어져서(싱글톤) 재활용되니, 메모리도 아끼고 성능도 좋아지죠!
💡 스프링이 따르는 5가지 황금률 (SOLID 원칙)
스프링이 이렇게 똑똑하게 일할 수 있는 건, 사실 객체 지향 설계의 5가지 황금률(SOLID)을 잘 따르기 때문이에요. 이 원칙들을 알면 코드가 왜 그렇게 짜여 있는지 이해하기 쉬워져요!
- S - SRP (단일 책임 원칙): "한 놈은 한 놈만 패!"
- 요리사 🧑🍳 한테 설거지까지 시키지 말자는 거예요. 클래스(부품)는 딱 한 가지 역할만 제대로 해야 수정하기 쉽고 이해하기 좋아요.
- O - OCP (개방-폐쇄 원칙): "확장은 OK, 수정은 NO!"
- 카페에 새 메뉴 🎁 를 추가하는 건 좋지만, 기존 아메리카노 레시피를 바꾸지는 말자는 거예요. 기능 추가는 쉽고, 기존 코드는 건드리지 않아 안정성을 높여요.
- L - LSP (리스코프 치환 원칙): "아빠 대신 아들이 와도 괜찮아!"
- 아빠(부모 클래스)가 하던 일을 아들(자식 클래스)이 물려받았으면, 아들이 아빠처럼 행동해야 한다는 거예요. 곰 인형 🧸 대신 팬더 인형 🐼 을 줘도 아이가 똑같이 좋아해야 하죠! 상속을 제대로 사용하자는 뜻!
- S - ISP (인터페이스 분리 원칙): "쓸데없는 기능은 주지 마!"
- 음악 플레이어 🎧 한테 녹음 기능까지 욱여넣지 말자는 거예요. 인터페이스(메뉴판)는 꼭 필요한 기능들만 묶어서, 작게 여러 개로 만드는 게 좋아요.
- D - DIP (의존관계 역전 원칙): "사장이 말단 직원에게 휘둘리지 마!"
- '아이패드'나 '갤럭시탭' 같은 구체적인 제품에 의존하지 말고, 그냥 '태블릿' 📱 이라는 추상적인 역할에 의존하자는 거예요. 그래야 나중에 다른 태블릿으로 바꿔도 코드를 고칠 필요가 없죠. DI가 바로 이 원칙을 실현하는 방법 중 하나예요!
🧙 스프링은 마법이 아니다! (하지만 마법처럼 편하다!)
어떠신가요? 이제는 스프링과 그 친구들이 조금은 만만해 보이나요? 😊
결론적으로 스프링은 POJO, IoC, DI, AOP 같은 기술과 SOLID 원칙을 버무려서, 개발자가 더 유연하고, 확장하기 쉽고, 유지보수하기 편한 프로그램을 만들 수 있도록 도와주는 아주 똑똑하고 친절한 프레임워크예요.
복잡한 백엔드 세계에서 길을 잃지 않도록 도와주는 든든한 나침반이자, 무거운 짐을 대신 들어주는 강력한 조수인 셈이죠. 🚀
스프링 부트, 너만 있으면 나도 백엔드 뚝딱? ✨ (feat. MVC & JPA 맛보기)
지난번엔 스프링(Spring)이라는 거대한 친구를 만나봤죠? 오늘은 스프링의 찰떡궁합 단짝, 스프링 부트(Spring Boot)와 그 친구들을 살짝 맛보는 시간이에요! "아하! 이런 거였구나!" 하고 가볍게 이해하는 게 목표입니다!
🌱 스프링 부트, 넌 누구냐? (개발자의 구세주!)
"스프링 좋긴 한데... 설정 너무 복잡해! 🤯" 하는 분들을 위해 나타난 도구에요!
- 정체: 스프링의 귀찮은 설정들을 싸악~ 자동으로 해주는 착한 개발 도우미예요.
- 능력: "복잡한 설정? 전 몰라요~ 제가 다 할게요!" 척척박사죠. 심지어 톰캣(Tomcat)이라는 웹 서버를 품고 있어서, 이 프로그램 하나만으로 웹 서버를 돌릴 수 있어요! 🏠
- 힘 키우는 법: 만약 서비스가 커져서 힘이 더 필요하면? 비싼 부품 하나(스케일업)보다, 비슷한 친구 여럿(스케일아웃)을 데려오는 게 더 효율적이고 싸대요! 👥
- 매력 포인트:
- 스타터(Starter): "이거랑 저거 주세요" 하면 필요한 재료(의존성)를 알아서 묶어줘요.
- No XML: 지긋지긋한 XML 설정 파일이 거의 필요 없어요.
- 내장 톰캣: 웹 서버 설치? 걱정 마세요, 이미 안에 있어요!
프로젝트 첫 단추: Spring Initializr
스프링 부트 프로젝트를 시작할 때 쓰는 마법 도구예요. 여기서 몇 가지 선택을 해야 하죠.
- Maven vs Gradle: 프로젝트 관리 도구인데, Maven은 클래식하고 쉽고, Gradle은 좀 더 세련되고 복잡한 프로젝트에 강해요.
- Kotlin: 자바를 더 편하고 똑똑하게 만든 언어! 요즘 핫해요. 🔥
- 버전 선택 팁: SNAPSHOT, RC 같은 딱지가 붙은 건 아직 테스트 중이라는 뜻! 실전에서는 안정적인 버전을 쓰세요. 그리고 내가 쓰는 자바 버전과 서버의 자바 버전은 꼭 맞춰주기! 🤙
- Dependencies에서 SpringBoot Dev Tools를 비롯해서 Web, Database, Lombok을 해서 간단히 웹을 만드는게 가능해져요.
🧩 MVC 패턴: 우리 사이좋게 일해요!
웹 서비스를 만들 때 쓰는 아주 유명한 '역할 분담 규칙'이에요. 마치 레스토랑처럼요! 🍽️
- M (Model): 주방 + 신선한 재료 🍳 (데이터 + 데이터 다루는 로직)
- V (View): 멋진 홀 + 메뉴판 🖼️ (사용자에게 보이는 화면)
- C (Controller): 손님 주문받고 주방에 전달하는 웨이터 🤵 (사용자 요청을 받아서 Model과 View를 연결)
왜 쓰냐고요? 각자 자기 일만 하니 협업도 쉽고, 나중에 고치기도 편해요! (단, 작은 프로젝트엔 좀 거창할 수도 있고, 웨이터가 너무 바빠질 수 있으니 주의!)
💽 스프링과 DB: 어떻게 대화할까?
데이터를 저장하는 DB와 스프링은 어떻게 대화할까요?
- JDBC: 자바가 DB와 말하는 '기본 언어'. 근데 좀 어렵고 번거로워요. 😥
- MyBatis: SQL(DB 언어)을 내가 직접 짜서 DB와 소통해요. 좀 더 컨트롤하기 좋죠.
- JPA: '마법 번역기' ✨! 자바 객체(우리가 다루기 쉬운 것)로 말하면, JPA가 알아서 SQL로 번역해서 DB랑 대화해요. 이게 바로 ORM(Object-Relational Mapping) 기술! 진짜 편해요!
🧠 JPA의 슈퍼파워: 영속성 컨텍스트
JPA가 마법 번역기일 수 있는 이유! 바로 '영속성 컨텍스트'라는 비밀 공간 덕분이에요.
- 영속성? 객체를 DB에 '영원히 저장' 하는 걸 말해요.
- 슈퍼파워들:
- 1차 캐시: 한 번 물어본 건 기억해요! (다시 안 물어봐서 빠름) 🧠
- 쓰기 지연: "저장해줘!" 요청을 모았다가 한 방에 처리해요! (효율적) 🛒
- 변경 감지: 객체 내용만 살짝 바꿔도 알아서 DB에 반영해요! (자동 저장 💾)
- 지연 로딩: "이거 줘!" 할 때까지 안 가져와요! (필요할 때만 로딩) 😴
📚 Spring Data JPA: JPA를 더 쉽게!
"JPA도 편한데... 더 편하게 해줄게!" 하고 나타난 친구예요. Repository라는 인터페이스만 만들어두면, 기본적인 조회, 저장, 수정, 삭제는 그냥 뚝딱! 만들어줘요.
📁 application.yml: 스프링 부트의 조종석!
이 파일 하나면 끝! 스프링 부트 프로젝트의 모든 설정 (DB 정보, 포트 번호, 로그 설정 등)을 이곳에서 관리해요. 마치 비행기의 조종석 🕹️ 같달까요?
스프링 부트, 레고처럼 조립하기! 🧩 (패키지, DB 친구들, API 꿀팁)
스프링 부트와 조금 더 친해져 볼까요? 이번엔 프로젝트를 어떻게 정리하고(패키지), 데이터베이스(DB)와는 어떻게 더 깊게 사귀는지, 그리고 웹 서비스의 대화법(REST API)은 뭔지 살짝 엿볼 거예요. 😉
🌱 폴더 정리의 기술 (패키지 구조)
코드가 많아지면 방 청소하듯 정리가 필요해요! 스프링 부트는 보통 이렇게 정리해요.
- 방법 1 (기능별): controller(웨이터), service(셰프), repository(창고 관리자)처럼 하는 일별로 모아요.
- 방법 2 (주제별): user(회원 관련), product(상품 관련)처럼 다루는 대상별로 모아요.
- 꿀팁: 어떤 방법이든, 가장 꼭대기에 있는 @SpringBootApplication 친구가 있는 폴더 아래에 사이좋게 모여 살게해요! 🏠
🏗️ DB 테이블? JPA가 만들어 줄게! (DDL & 엔티티)
DB에 표(테이블)를 만드는 걸 DDL이라고 해요. 근데 JPA가 있으면 우리가 직접 할 필요 없이 알아서 척척 만들어줘요!
- 엔티티 클래스: DB 테이블의 설계도예요. 자바 클래스로 만들죠.
- @Id: "이건 주민등록번호야!" (필수! 각 줄을 구분하는 대표값)
- @GeneratedValue: "번호는 자동으로 매겨줘!"
- @Column: "이 칸은 글자 50자까지만!" (세부 조건 설정)
- @Lob: "여긴 긴 글이나 사진 넣을 곳!" 🖼️
- @Transient: "이건 DB에는 저장하지 마!" (잠깐 쓰는 값)
- 롬복(Lombok): @Getter, @Setter 같은 걸 붙이면, 귀찮은 코드를 마법처럼 줄여주는 고마운 친구예요! 🪄
🔗 친구 맺기 (연관관계 매핑)
테이블들도 서로 친구를 맺어야 해요. JPA는 이걸 '연관관계 매핑'이라고 불러요.
- 1:N (하나 대 여럿): 학과 1개 ↔ 학생 N명 👨🎓👩🎓
- N:1 (여럿 대 하나): 주문 N개 ↔ 고객 1명 🧑💼
- 1:1 (하나 대 하나): 유저 1명 ↔ 프로필 1개 👤
- N:M (여럿 대 여럿): 학생 N명 ↔ 동아리 M개 🎸 (이건 중간에 연결 다리가 필요해요!)
- 어노테이션: @OneToMany, @ManyToOne, @OneToOne, @ManyToMany 같은 이름표를 붙여서 JPA에게 알려줘요.
- 주의! 순환참조: A가 B를 보고, B가 A를 보는 무한 루프에 빠질 수 있어요! 😵💫 @JsonManagedReference, @JsonBackReference 같은 걸로 교통정리를 해줘야 해요!
🌐 웹의 대화법, REST API 엿보기
요즘 웹 서비스들은 REST API라는 스타일로 대화를 나눠요.
- REST란?
- 자원(Resource): /users/1 (1번 유저), /products/10 (10번 상품)처럼 URL로 대상을 명확히 해요.
- 행위(Verb): GET(줘), POST(만들어), PUT(바꿔), DELETE(지워) 같은 HTTP 메서드로 뭘 할지 알려줘요.
- 표현(Representation): 데이터는 주로 JSON이라는 형식으로 주고받아요.
- 핵심 특징: 무상태(Stateless)! 서버는 방금 누가 요청했는지 기억하지 않아요. 그래서 매번 "나 누구야!" 하고 알려줘야 하죠 (주로 JWT 같은 토큰으로).
스프링 부트로 앱을 만드는 건, 마치 잘 만들어진 레고 블록들을 조립하는 것과 같아요. 각 블록(개념)이 어떤 역할을 하는지 알면, 더 멋진 작품을 만들 수 있을거 같아요! 😄
✅ 60일차 금요일(05/24)
- 월차를 사용해서 한국경제신문 AICE Associate 합격자 인터뷰에 참석했다.
- 자세한 내용은 👉 이곳에서 확인
처음의 마음을 기억하며
비교하지 말고, 욕심내지 말고, 지금 해야 할 일을 하자.
'KT AIVLE > 주차별 수업' 카테고리의 다른 글
[KT AIVLE] 7기 (AI트랙) 11주차 (3) | 2025.06.08 |
---|---|
[KT AIVLE] 7기 (AI트랙) 10주차 (2) | 2025.06.03 |
[KT AIVLE] 7기 (AI트랙) 8주차 (4) | 2025.05.17 |
[KT AIVLE] 7기 (AI트랙) 7주차 - Step1완료 (0) | 2025.05.07 |
[KT AIVLE] 7기 (AI트랙) 6주차 (3) | 2025.05.04 |