
JQeuryFirebaseGit오늘은 내배캠 1일차이다.이전에 프론트엔드를 조금 접해본 적이 있지만, 잊은 것이 많았기 때문에 웹개발 기초를 다지기 위해 기본으로 제공된 강의를 수강했다.데이터베이스는 데이터를 저장하고 여러 사람들이 관리하는 데이터의 모음→ 잘 정리해두

내배캠 2일차 (2025.02.18) 우리 팀을 소개하는 페이지를 만들어보자. 0️⃣ 레퍼런스 수집 우리 팀을 소개하는 페이지인데 진부하거나 딱딱한 페이지로 만들기는 싫었다. 그래서 여러가지 레퍼런스를 수집했다. 1. 인스타그램 가장 많이 사용하는 SNS인 인스타그램

팀 페이지에 게시글을 추가하는 기능이 필요했기 때문에, firebase에서 게시글 데이터 관리와 댓글 관리를 추가하기로 했다! 🔥 Firebase 세팅 1. firebase 프로젝트 생성하기 firebase 콘솔에서 프로젝트 만들기를 클릭해 TeamIntroduc

💡 file-tree-generator 사용하기! 폴더 구조를 다 하나씩 만들기 빡세다고 생각했는데, 이런 꿀팁이 있었다... vs코드에 설치하고, 파일에 오른쪽 클릭하면 'generate to tree'를 누르면 이런식으로 쉽게 생성할 수 있다 git에 적

강의를 들으면서 firestore에 data를 저장하는법, 꺼내는 법, 그리고 갱신하는 방법은 알게됐다. 근데 왜 await를 사용하는지 궁금증이 생겼다. await는 비동기 코드에서 Promise가 처리될 때까지 기다리는 역할.: '직렬적'으로 작동하는 방식: '병렬

연관 코딩 링크 - 댓글이 firestore에 add와 get은 잘되었지만, add하자마자 페이지에 반영되지 못했다. 그래서 바로바로 추가되면 좋겠다고 생각했다.이때 사용 가능한 것이 바로 Firestore의 실시간 리스너 onSnapshot() 이다!Fires
댓글 기능을 구현하고 싶었다 commentList 내부에 speech-bubble 이라는 채팅 블럭을 만들어 넣고 싶었다. 그리고 commentMake 칸의 Input을 사용해 댓글을 입력할 수 있게 했다. 💫 Js파일 만들기 파일을 나눠서 관리하면 보기도 쉽고,
🗓️ 2025.02.21 너무나도 짧은 3일 간의 팀프로젝트가 끝났다. 비록 3일이지만 노션으로 일정관리도 했고 매일 오전 오후에 짧게 진행상황을 체크했다. 팀원분께 ppt 초안을 받아서 디자인을 맏았는데, 발표자료까지 완성하고 나니 정말 프로젝트가 끝났구나 실

Java에서 method 를 활용하는 파트를 공부하다가, 어떤 함수는 void 를 쓰고, 어떤 함수는 안쓰는 것을 확인할 수 있었다.근데 return으로 반환하는 것과 아닌 것은 무슨 차이가 있을까? 왜 어떤 함수는 굳이 return을 쓰고 어떤 함수는 void로 자동
자바의 접근제어자에 대해 알아보자! 접근 제어자 접근 제어자는 무엇일까? 접근 제어자의 종류 4가지 종류가 있다 > public : 어디에서든지 불러와서 사용 가능 private : 모든 호출 다 안됨. 자기만 쓸거라고 하는거 default : 같은 패키지 안에서
자바의 메모리 구조는 크게 3가지로 나눌 수 있다. 메서드 : 자바가 실행되면 가장 먼저 실행되고, 자바 종료까지 계속 유지된다. 스택 : 자바를 실행하면 하나의 실행 힙
final은 연상되는 뜻과 같이, 최종 진짜 찐 ㄹㅇ 최종으로 변수의 값을 더는 값을 변경할 수 없다는(불변) 뜻이다.이후에 만약 변수의 값을 변경하면 컴파일 오류가 발생한다final을 필드에서 사용하면 생성자에서 딱 한 번만 초기화할 수 있다.만약 위의 코드처럼 생성
📌 문제점 자바로 계산기를 만드는 중, 연산자를 받아 어떤 연산자인지 if문을 활용해서 구분하고 결과를 출력하는 로직을 구현하고 있었다. 그래서 익숙하게도 아래처럼 코드를 작성했는데 결과가 계속 0으로 나왔다. 분명히 result 변수에 add 함수를 적용해서 값이

1. 👀 상속이란? : 상속은 객체 지향 프로그래밍의 핵심요소 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용할 수 있도록 해준다! → 기존 클래스의 속성과 기능을 그대로 물려받는 것.(공통 기능이 있을 때 효과적으로 사용 가능) ✨ extends 키워드 사용
1️⃣ 추상화 : 불필요한 정보를 제거하고 본질적 특징만 남기는 것. → 유지보수성이 좋은 프로그램 공통적인 속성과 기능을 정의 → 코드의 중복 ↓ → 클래스 간 관계를 효과적으로 설정 1. abstract 제어자 abstract가 클래스나 메서드에 붙으면, 자동으
간단하게 계산기 기능을 구현했었는데, 여기서 더 발전된 코드로 개선했다. 클래스를 적용하기 결과값을 저장하는 리스트 만들기 캡슐화를 통해 결과값을 저장하고 있는 컬렉션에 직접 접근하지 못하도록 하기 1️⃣ 기존 코드 개선 while + case 문 기존 코드는 do
3️⃣ Generic 제네릭 Object를 사용하면 재사용은 해결할 수 있었지만, 타입 안정성이 떨어지진다 down Casting을 꼭 해주어야하는 문제가 생긴다. 이때 제네릭을 활용하면 재사용성과 타입 안정성을 모두 잡을 수 있음 타입 소거가 발생하면서 재사용성이
1. 코드 중복 삭제 자료형 변경 Lambda & Enum 활용하기 1️⃣ 코드 불필요한 중복 삭제 1. 기존 코드 리팩토링 기존 코드에서 Setter를 설정하기 위해 CalculatorClass에서 private double result=0;으로 result값을 설

햄버거 가게의 키오스크를 만들어보자!레벨 1 : 기본적인 키오스크 프로그래밍레벨 2 : 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리하기키오스크에는 햄버거, 음료, 사이드메뉴가 있다.입력, 출력, 각 메뉴 관리, 전체 메뉴 관리의 선택이 가능하다.콘솔 기반허용한

✏️ 목표 : 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기 main 함수에서 관리하던 전체 순서 제어를 Kiosk 클래스를 통해 관리합니다. Kiosk 클래스 생성하기 [ ] MenuItem을 관리하는 리스트가 필드로 존재합니다. [ ]

📌 HashSet이란? Java의 Collection 프레임워크 중 하나 요소를 저장할 때 순서를 유지하지 않고, 중복을 허용하지 않는 자료구조 내부적으로 HashMap을 사용하여 구현 HashSet 활용법 | 메서드 | 설명 | | --- | :--- | | ad

[ 기존 코드의 문제점 ] Kiosk 클래스에서 메뉴 추가 및 관리까지 담당해서 복잡함 → 메뉴를 관리하는 클래스를 만들기 Menu 키오스크에서 햄북스딱스만 선택할 수 있었음 → 메뉴 카테고리(햄버거, 음료, 디저트)를 먼저 선택하고 그에 맞는 메뉴 띄우기 카테고리
이제 메뉴를 선택하는 것만이 아니라 장바구니에 담고, 정말 주문할 것인지도 물어보자 [ 구현할 것 ] 장바구니 총액 계산하기 클래스 정리 1️⃣ 장바구니(OrderList) 클래스 만들기 장바구니 클래스를 분리해서 만들자 private로 리스트를 관리하고 gette
팀원들의 도움으로 내 코드의 어떤부분이 문제인지, 어떻게 개선하면 좋을지, 가이드를 얻을 수 있었다...(감사합니다ㅠㅠ)(1) 너무나도 절차지향적인 코드를 생산해낸 멋진(negative) 나^^...Menu클래스만 보더라도, 한 클래스에서 너무 많은 기능을 담당하고 있
키오스크의 기능을 더 확장하고, 효율적으로 개선하기 위해 stream()을 사용했는데, 이 과정에서 forEach, filter, AtomicInteger를 배웠다.이들은 함수형 스타일로 데이터를 처리하고, 값들을 안전하게 다룰 수 있는 방법을 제공해준다!Stream은
클래스 간 역할 분리가 잘안돼서 메뉴 관리와 주문 처리가 한 클래스에 혼재되어 있었다ㅠㅠ메뉴 추가와 주문 저장 기능을 같은 클래스에서 처리하면서 각 클래스의 명확한 기능이 없었다. 또한 유지보수할 때, 메뉴 관련 로직을 수정하면 주문 처리 로직도 영향을 받는 문제가 발

0️⃣ HTTP란? : HyperText Transfer Protocol → 다양한 형태의 데이터(텍스트, 이미지, JSON)가 HTTP를 통해 전송됨. HTTP는 클라이언트와 서버 사이의 요청과 응답에 사용되고, 서버 간의 데이터 통신에도 사용된다. 클라이언트는
Annotation은 자바 코드에 추가하는 마법 코드!프레임워크가 특정 동작을 수행할 수 있도록 명시하고 전달하는 방식이라고 할 수 있다예시로 @Override @controller @RestController 등등이 있다: 로깅 라이브러리를 사용하기 위해 선언하는 a

🍃 Spring 시작 가이드 인텔리제이에서 new project Generators를 Spring Boot로 설정하고 Language는 Java, Gradle-Groovy JDK는 Amazon Corretto로 설정후 next! Dependency에 Spring

(맥북 기준으로 작성되었습니다) 1️⃣ IntelliJ & MySQL DB를 사용하고 싶은 프로젝트를 열고 인텔리제이의 오른쪽에 있는 DB를 누르고 Data Source 에서 현재 자신의 컴퓨터에 설치되어있는 DB 시스템을 선택합니다 저는 MySQL을 사용했습니다

Todo 리스트를 생성, 조회, 수정, 삭제할 수 있는 프로그램을 만들어보자.JDBC 사용DB를 연결해 지속적으로 데이터를 관리MVC 패턴에 추가적으로 Service Layer 와 Repository Layer 를 분리하여 유지보수와 확장성을 강화0\. API문서 작성

❓ 자료형 반환값에 대해 나는 Spring에서 메서드를 만들면서 가장 헷갈렸던 부분이 바로 어떤 자료형으로 반환할 것인가였다. CRUD에 따라 깔끔하게 정리해보자! 반환 타입 결정하기 |상황|반환 타입| |--|--| |저장 (CREATE) |ResponseDto (저장된 데이터 반환) or boolean (성공 여부만) |조회 (READ, 전체 목록...

지난 3일간 TODO리스트를 관리할 수 있는 간단한 스프링부트 프로그램을 만들었다. 🔗 깃허브에서 보기 처음 다루는 Spring으로 우여곡절이 많았고, 어질어질 빙글빙글했지만,,,, 그래도 과제 필수까지 완료했다!! 여기까지 진행한 나 칭찬해. 아니 반성해. 아
: 객체(Bean)를 생성 및 관리하고 의존성을 주입하는 역할여기서 이 빈을 만드는 것의 담당자는 바로 스프링 컨테이너임ㅋ: Spring 컨테이너가 관리하는 객체→ 원래는 그냥 자바 객체가 스프링을 만나서 스프링이 이 객체를 관리하게 되면서 그 순간부터 객체가 아니라
🥜 Bean Validation 검증 기능을 매번 BingdingResult처럼 코드로 구현하는건 좀 힘들다... 이렇게 되면 작은 프로젝트는 괜찮지만, 조금만 프로젝트가 커져도 Controller의 크기가 너무너무 커지며 단일 책임 원칙에 위배된다. 이 문제를
JPA: Java의 ORM 기술 표준(인터페이스) 객체와 RDB 간의 매핑을 자동으로 처리 → 패러다임 불일치 문제 해결생산성 향상SQL을 직접 작성하지 않고, persist(), find(), remove()\` 같은 메서드로 간단하게 데이터를 조작할 수 있다.유지보

🔗 JPA Query Method 가이드 🧶 프로젝트 초기 설정 Dependencies 추가 Spring Web Lombok Spring Data JPA MySQL Driver 프로젝트 생성 뒤, build.gradle에서 위처럼 의존성이 잘 추가되었는지 확인

스프링에서 레이어 아키텍처로 프로젝트를 개발하면, reposiory에서 DB와 상호작용한다.그때

Todo 서비스의 회원 CRUD, 회원별 게시물 CRUD 기능이 모두 구현되었다이제 회원가입 후 쿠키와 세션을 활용해 인증 기능을 만들어보자📌 요구사항1\. 회원가입 후 로그인하기2\. 로그인하면 쿠키와 세션 남기기3\. @Configuration 을 활용해 페이지별
프로젝트의 객체에 다양한 제약사항을 걸고 이를 만족하지 않을떄 날릴 예외처리를 내 입맛대로 만들어보자 🕳️ Spring MVC 예외 처리 흐름 클라이언트의 요청이 들어가면 → Servlet 컨테이너 → Spring DispatcherServlet → Control

사용자의 비밀번호를 그대로 DB에 저장하면 보안상의 문제가 생길 수 있다.때문에 그대로 저장하는게 아니라, 암호화를 한 후에 저장해야한다.

기존 프로젝트를 할 땐, 응답을 내 마음대로 막 string했다가, responseDto했다가 boolean했다가 void했다가 난리 엉망진창 부르스 에바쎼바 쌈바 췄었는데....응답을 통일하는 것의 중요성을 깨달았다!!(프론트한테 욕 안먹으려면 해야됨요)그리고 이 과
세션과 필터를 사용해 사용자의 정보를 이용해보자
Filter에서는 왜 GlobalExceptionHandler가 동작하지 않을까?Spring Boot로 로그인 기능을 구현하면서 예상치 못한 문제를 만났다.로그인을 하지 않은 사용자가 접근하면, 필터에서 예외를 던져 GlobalExceptionHandler에서 처리되길
일주일간의 너무 짧은 기본 프로젝트가 끝났다ㅠㅠ 겪었던 트러블 슈팅과 더불어, 그동안 느꼈던 어려움이나 개선할 점에 대해 남겨보고자 한다. 🔧 트러블슈팅 1. 로그인 필터 예외(GlobalExceptionHandler) 🤔 문제 상황 Spring Boot 프로젝
웹 브라우저에서 우리가 어떤 주소에 접속하거나 버튼을 누르는 것 → 요청(Request)Spring은 이런 요청을 받아서 처리하고, 응답(Response)을 돌려준다!예를 들어, 주소창에 이렇게 입력한다면http://localhost:8080/hello?nam
N+1 문제는 무엇이고, 왜 발생할까??: N+1 문제는 1번의 쿼리로 N개의 엔티티를 조회한 후, 각 엔티티의 연관된 엔티티를 N번 추가 쿼리로 조회하는 상황!➡️ LAZY로 엔티티를 만들었을 때 발생함!(이렇게 말하면 이해가 잘 가지 않으니,,, 예시로 알아보자)S

테스트 코드란 뭐고 언제 쓰면 좋은걸까?: 실제 코드가 정상적으로 동작하는지 검증하는 코드(기대한 대로)➡️ 나중에 수정이나 리팩토링을 해도 기존 기능이 잘 유지되는지 확인할 수 있다!!만약 내가 비밀번호 암호화하는 메서드를 만들었는데, 이게 제대로 작동하는게 맞는지

Interceptor랑 AOP가 먼데...... 그게 뭔데,... 먹는거입니까? 한 번 알아보자! (AOP하면 버터밖에 생각이 안나는 먹보ㅠㅠ) Intercepter와 AOP는 Spring에서 요청 처리 과정이나 메서드 실행 과정에 끼어들어서 부가적인 작업을 처리할
📌 TestCode 만들기 우리가 하고 싶은 것!! "가게 주인이 새로운 가게를 만들면, 진짜 잘 만들어지는지 확인하고 싶어!" ➡️ StoreServiceImpl에서 createStore 메서드가 잘 작동하니? 테스트 코드에게 조건과 Mock(거짓된, 가짜의) 객체들을 넣어주고 그 객체를 넣었을 때 메서드가 잘 돌아가니? StoreServiceIm...

트러블 슈팅과 회고록

👀 Overview 먼저 본격적으로 들어가기 전에, 각 테스트가 언제, 왜 쓰이는지 대애충 보고 가보자 | 구분 | 단위 테스트 (Unit Test) | 슬라이스 테스트 (Slice Test) | 통합 테스트 (Integration Test) | |------|--------------------------|------------------------...
Cascade는 부모가 어떤 행동(예: 저장, 삭제)을 할 때, 자식에게도 그걸 자동으로 같이 해주는 기능'고아 객체'는 말 그대로 더 이상 부모가 없는 자식 객체만약 부모에서 자식을 제거했을 때, 자식이 혼자 남게 되면 어떻게 될까?이러케 설정하면 → 그의 자식 객체

피그마를 다룰 줄 아시나요? 그렇다면 당신은 축복....프론트엔드를 단 5초만에 만들어버릴 수 있습니다^^지금부터 Cursor AI로 프론트엔드를 함께 만들어보아요피그마 계정 🎨IDE (VScode 또는 IntelliJ 등등) 🖥️분주하게 움직일 손 ✋먼저 피그마를
외부 시스템과 통신할 때, 간헐적으로 장애가 발생하는 경우가 있다.한 번 실패했다고 바로 에러를 반환해버리면 사용자 경험은 물론 시스템 신뢰성에도 문제가 생길 수 있따...ㅜㅜ이런 상황을 해결하기 위한 자동 재시도(Retry) 기능, spring-retry를 알아보쟈!
🧈 1. AOP란 뭘까? AOP는 "관점 지향 프로그래밍"이라는 뜻 ➡️ 특정 행동이 일어나면, 자동으로 추가 행동을 몰래 넣는 기술! 📌 AOP는 언제 쓰면 좋을까? 1. 로그 남기기 📋 : 관리자가 접근했네? 언제 무엇을 했는지 남길때 2. 보안 검사 🔐
JPA의 CascadeType.ALL과 CascadeType.PERSIST는 둘 다 영속성 전파(cascade persist)를 포함하고 있지만, 용도와 상황에 따라 구분해서 사용해야한다!이 둘이 헷갈려서 글을 남기면서 이해하려고 한다ㅠㅠ
🔗 연관관계 매핑이란? ✔️ 현실 세계처럼, 객체들도 관계를 맺는다 현실에서 "학생은 학교에 다닌다", "가게는 여러 상품을 판다"처럼 관계가 있듯이, 객체 사이에도 관계가 있다! JPA는 이 관계를 테이블이 아니라 객체 중심으로 표현할 수 있게 해주는 도구이다 (O
: permitAll()과 JWT Filter WhiteList의 차이점 및 통합 관리 방안 permitAll() vs JWT Filter WhiteList 1. permitAll()의 동작 방식 permitAll()은 Spring Security의 인가 단계에서 작
Github Oauth2.0 구현 자체는 이전의 블로그 포스팅을 참고하자! 전체적인 플로우는 아래 이미지와 같다 유의할 점 1 (이메일(goolge/naver) OAuth와 다른 점) Github에서 해당 유저가 아래 이미지처럼 이메일을 public으로 풀어두지 않으면 OAuth 정보를 받아올 때 null 값으로 들어온다 나는 인터페이스를 통해 다양한 ...

: 웹소켓이란 웹브라우저와 서버가 실시간으로 아주 빠르게 대화할 수 있게 해주는 기술이다.사진 출처 : https://sendbird.com/ko/developer/tutorials/websocket-vs-http-communication-protocols우리
\*본 글은 회사의 코드와 연관이 없으며, 업무 외의 시간에 공부 목적으로 쓴 글입니다기존 풀링 방식에서는 5초에 한 번씩 땡겨서 사용했음→ 실시간으로 채팅이 막 오면 동시성을 보장하기 어렵고바로바로 채팅이 반영이 안되니까 사용자 사용성이 매우매우 떨어짐또한 채팅을 이