
🔥 혹시 아직도 더 개선할 부분이 있을까?43) 강한 결합의 문제점 '강한 결합' 이해를 위한 예제Contoller1 이 Service1 객체를 생성하여 사용Service1 이 Repostiroy1 객체를 생성하여 사용Repostiroy1 객체 선언만약, 다음

47) 스프링 IoC 컨테이너 👉 저희는 앞에서 DI 를 사용했을 때의 장점을 살펴 보았습니다. 그런데 DI 를 사용하기 위해서는 객체 생성이 우선 되어야 했습니다. 과연 어디서 객체 생성을 해야 할까요? 바로 스프링 프레임워크가 필요한 객체를 생성하여 관리하는

50) 스프링 3계층 Annotation 적용 👉 스프링 Annotation @Componet, @Autowired 앞에 '@' 를 붙여 선언 → 스프링이 처리스프링 3계층 Annotation 은 모두 @Component@Controller, @RestCont

52) 스프링 프레임워크란?The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on an

4) 인증 vs. 인가 💡 인증과 인가는 한글로 보나 영어 (Authentication vs. Authorization) 로 보나 비슷해 보일 뿐 아니라 실제 많이 혼동되어 사용되고 있지만 명확히 다른 의미를 가지고 있습니다. 출처: https://a

5) 사용자를 구별하지 못 하는 HTTPHTTP 는 상태를 저장하지 않습니다. ('Stateless' 하다)아래 그림에서 클라이언트의 요청 (GET http://spartcodingclub.kr)을 서버에게 보낸 후 응답을 받을 때까지가 하나의 HTTP 요청입

9) 스프링 시큐리티 적용 👉 '스프링 시큐리티' 프레임워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어 줍니다. 마치 '스프링' 프레임워크가 웹 서버 구현에 편의를 제공해 주는 것처럼요!'스프링 시큐리티' 프레임워크

11) 회원 가입 UI 반영프론트 개발자가 회원 가입 및 로그인 UI 를 구현 완료해서 전달해줌타임리프 모듈 추가코드스니펫 build.gradle회원 가입 Form 페이지코드스니펫 resources > templates > signup.html회원 로그인 Form 페이

🔥 지금부터 '스프링 시큐리티' 프레임워크를 사용해서 회원 가입 기능을 구현해 보겠습니다.13) 회원 테이블 설계회원 DB 설계요구사항과 디자인을 확인하며 어떤 정보가 저장되어야 할지 정리 필요 업로드중..14) 관리자 회원 가입 인가 방법'관리자 가입 토큰' 입력

18) 로그인, 로그아웃 처리 과정 이해스프링 시큐리티 사용 전 스프링 시큐리티 사용 후 Client 의 요청은 모두 Spring Security 를 거침Spring Security 역할인증/인가성공 시: Controller 로 Client 요청 전달Client 요
21) 상품 등록 및 조회 (모든 회원)상품 등록 API 가 처리되지 않고 있음POST "/api/products" 요청 → HTTP 403 ForbiddenPOST 요청마다 처리해 주는 대신 CSRF protection 을 disable 1) POST 요청마다 처리

23) 상품 조회 (관리자용) 설계Client 에서 "일반 회원" 과 "관리자" 구분하여 API 호출 필요일반 회원: GET /api/products관리자: GET /api/admin/products프론트 개발자와 작업 방법 논의서버에서 역할을 프론트에 내려줄 수 있는

25) API 접근 권한 제어 이해스프링 시큐리티에 "권한 (Authority)" 설정방법회원 상세정보 (UserServiceImpl) 를 통해 "권한 (Authority)" 설정 가능권한을 1개 이상 설정 가능"권한 이름" 규칙"ROLE\_" 로 시작해야 함예) "A

27) 소셜 로그인 탄생 배경 👉 모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담이 됩니다. 매번 번거로운 회원가입 과정을 수행해야 할 뿐 아니라, 웹 사이트마다 다른 아이디와 비밀번호를 기억해야 합니다. 또한 웹 사이트를 운영하는 측에서도 회

29) 카카오 로그인 사용 승인 받기 👉 아래는 카카오 로그인의 큰 흐름을 설명해 주는 그림입니다.

30) 카카오 서버에서 인가코드 받기 🌐 참고: "인가코드 받기" 메뉴얼(https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api 카카오 인가코드 받기인가코드 요청 방법"/templates/
32) 카카오 사용자 회원가입 설계 👉 관심 상품 등록을 했을 때 회원 구분이 필요하기 때문에, 카카오서버에서 받은 사용자 정보를 이용해 회원 가입을 합니다. 카카오로 부터 받은 사용자 정보 kakaoId nickname

33) 카카오 사용자 정보로 회원가입User 테이블에 'kakaoId' 추가코드스니펫 model > User회원 가입 kakaoId 를 가진 회원이 없는 경우에만 회원 가입코드스니펫 카카오 사용자 회원가입코드스니펫 repository > UserRepository34

36) JWT 란?JWT 사용이유 파악서버가 1대인 경우Session1 이 모든 Client 의 로그인 정보 소유서버가 2대 이상인 경우서버의 대용량 트래픽 처리를 위해 서버 2대 이상 운영 필요Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있음S
블랙박스 테스팅👉 블랙박스 테스팅이란 소프트웨어 내부 구조나 동작원리를 모르는 블랙박스와 같은 상태에서, 즉 웹 서비스의 사용자 입장에서 동작을 검사하는 방법입니다!장점누구나 테스트 가능 - 개발자부터 디자이너, 베타 테스터 혹은 사장님까지!단점기능이 증가될 수록 테

3) 단위 테스트란?프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다. 출처: 단위 테스트 (위키백과) 👉 버그 발견 시간이 늦어짐에 따라 비용이 기하급

AS-IS) 설계 → 개발 → 테스트 (→ 설계 수정) 순서를TO-BE) 설계 → 테스트 (→설계 수정) → 개발로 변경

이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다.출처: 단위 테스트 (위키백과)분리 되기 어려운 클래스들Controller 클래스만 테스트할 수 없을까?테스트 범위: Controller,

Mockito 를 사용한 단위 테스트 구현 Mockito framework: Mock 객체를 쉽게 만들 수 있는 방법 제공Mock 사용 케이스 추가코드스니펫 Mock 사용케이스 추가

단위 테스트 VS 통합 테스트 출처: Unit Testing: Creating Functional Alexa Skills단위 테스트 (Unit Test)하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트 가능모듈 간에 상호 작용 검증 못함통합 테스트 (Integ
스프링 부트 이용한 통합 테스트통합 테스트여러 단위 테스트를 하나의 통합된 테스트로 수행Controller → Service → Repository단위 테스트 시 스프링은 동작 안 됨 예제 코드)"@SpringBootTest"스프링이 동작되도록 해주는 어노테이션!테스
24) 스프링 MVC 테스트코드스니펫 build.gradle코드스니펫 test > mvc > MockSpringSecurityFilter코드스니펫 test > mvc > UserProductMvcTest🌐 그 외 다양한 Spring Boot 테스트 Annotation

1) ORM이란? 💡 ORM: Object-Relational Mapping Object: "객체"지향 언어 (자바, 파이썬) Relational: "관계형" 데이터베이스 (H2, MySQL) 백엔드 개발자(Backend Developer): 웹 서버를 개발하

영속성 컨텍스트?JPA객체 - ORM - DB객체 - 영속성 컨텍스트 매니져 (entity context manager) - DB영속성 컨텍스트 매니져객체 ↔ DB 의 소통을 효율적으로 관리PK (Primary Key)테이블에서 각 row 마다 가져야 하는 유일무이한

7) 영속성 컨텍스트 1차 캐시Entity 저장 시Entity 조회 시1차 캐시에 조회하는 Id 가 존재하는 경우1차 캐시에 조회하는 Id 가 존재하지 않은 경우8) Entity 삭제 9) Entity 업데이트 실패Entity 객체를 수정해도 DB 에는 updat
JPA 연관관계 설정방법👉 JPA 의 경우는 Enitity 클래스의 필드 위에 연관관계 어노테이션 (@) 을 설정해 주는 것만으로 연관관계가 형성됩니다!JPA 코드 구현 중요) 항상 Enitity 본인 중심으로 관계를 생각!주문 (Order) 코드음식점주 (Owne
16) Spring Data JPA 는?JPA 를 편리하게 사용하기 위해, 스프링에서 JPA 를 Wrapping스프링 개발자들이 JPA 를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반복적인 코드들 → Spring Data JPA 가 대신 작성Repostior

5) 부가기능 모듈화의 필요성 '핵심기능': 각 API 별 수행해야 할 비즈니스 로직 '부가기능': 핵심기능을 보조하는 기능 문제점 모든 '핵심기능'의 Controller 에 '부가기능' 코드를 추가했을 때..

스프링 AOP 동작 이해개념적 이해 스프링 실제 동작 시퀀스 다이어그램 (Sequence Diagram)AOP 적용 전 AOP 적용 후 DispatcherServlet 과 ProductController 입장에서는 변화가 전혀 없음호출되는 함수의 input, o

트랜잭션이란?트랜잭션: 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계ACID (원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어출처: 위키백과트랜잭션의 특징더 이상 쪼갤 수 없는 최소단위의

Primary / Replica 운영방식쓰기 전용 DB (Primary) 와 읽기 전용 DB (Replica) 를 구분 Primary 에 문제가 생겼을 때 Replica 중 1개가 Primary 가 됨

Controller 마다 예외처리 코드를 추가해주는 것은 안좋음Global 예외 처리 @ControllerAdvice 사용@RestControllerAdvice@ControllerAdvice + @ResponseBodyErrorCode 선언서비스 전체에 사용할 에러코

21) 스프링 MVC?MVC (Model - View - Controller) 디자인 패턴Server 에서 HTML 을 내려 주는 경우정적 (static) 웹 페이지ControllerClient 의 요청을 Model 로 받아 처리예) 회원가입을 위한 개인 정보들 (id

26) Controller 와 HTTP Request 메시지 코드스니펫 HelloRequestController.java코드스니펫 hello-request-form.html

32) AllInOneController 코드 설명 👉 Service, Repository 없이 Controller 한 개로도 잘 동작하네? 일단 이렇게 잘 동작하는 AllInOneController 내용을 살펴봅시다. 웹 서비스 구성도 관심상품 등록 API

35) Controller, Service, Repository 역할 👉 서버 개발자들은 서버에서의 처리과정이 대부분 비슷하다는 걸 깨닫고, 처리 과정을 크게 3개로 분리했습니다. 스프링에서 이미 구분해서 사용해 본적 있던 Controller, Service, Re

38) Controller, Service, Repository 로 코드 분리 👉 AllInOneController 클래스의 이름부터 변경해 볼까요? AllInOneController.java → ProductController.java클래스이름 변경 방법AllI
🔥 혹시 지금까지 구현한 코드를 조금 더 개선할 수 있을까요?41) 객체 중복 생성 문제 👉 ProductService 를 보시면 "new ProductRepository()" 코드가 중복되는 게 보이시나요? 👉 아래 코드는 "빵틀에서 빵을 만들라"는 명령을
프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 하기 위해 적용할 수 있는 5가지 지침1\. 단일 책임 원칙 (SRP : Single Responsibility Principle)한 클래스는 하나의 책임만 가져야 한다.작성된 클래스는 하나의 기능만 가지며 클래스가 제

HashMap 사용 시 동시성 문제를 해결하기 위해 ConcurrentHashMap을 사용한다고 한다.본 글은 HashMap과 ConcurrentHashMap에 대한 비교 내용이다.1) Thread Safe주요 차이점은 ConcurrentHashMap은 내부적으로 동기