https://start.spring.io스프링 부트 기반으로 스프링 프로젝트 생성ProjectMaven, Gradle: 필요한 라이브러리 가져오고 빌드 라이프사이클 관리해주는 툴.요즘은 대부분 Gradle 씀. 예전엔 MavenProject MetaGroup
welcome pagesrc/resources/static/index.html 넣어두면 자동으로 welcome 페이지로 만듦.https://docs.spring.io/spring-boot/docs/current/reference/html/공식 문서에서 검색하고
정적 컨텐츠templates 에 html 파일 넣어두면 (ex.html) localhost:8080/ex.html 에서 html 그대로 보임.MVC와 템플릿 엔진MVC: Model, View, Controllerhello-template.htmlAPI템플릿 엔진이 화면
일반적 웹 어프리케이션 계층 구조 (MVC)컨트롤러 -> 서비스 -> 리포지토리 -> db서비스: 핵심 비지니스 로적 구현
도메인 주도 설계 (Domain Driven Design)도메인을 중심으로 설계해가는 방식.DAO (Data Access Object) (= repository)실제 DB에 접근해 data를 CRUD하는 객체.service 와 DB 연결해주는 역할인터페이스와 그에 대한
회원 서비스는 회원 레파지토리와 도메인 활용해서 실제 비지니스 로직 작성하는 과정
java.util.Optional<T> 클래스Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)Optional 객체 사용하면 NullPointException 발생하지 않도록 도와줌.Optional 클래스
스프링 빈(Bean): Spring IoC 컨테이너가 관리하는 자바 객체들스프링 빈 등록 방법 1: 컴포넌트 스캔 (어노테이션)컨트롤러, 서비스, 레파지토리에 모두 적용해야 함.@Component 어노테이션이 있으면 스프링 빈으로 자동 등록Controller, Serv
스프링을 사용해 테스트를 해보자.
JDBC API에서 반복 코드(result set connection 얻기 ...) 대부분 제거해줌.but SQL은 직접 작성해야 함.JdbcTemplateMemberRepository.java
jpa는 기존 반복 코드도 제거하고 sql도 직접 만들어서 실행. (java orm)개발 생산성 크게 높일 수 있음.jpa가 인터페이스, hibernate가 구현체JpaMemberRepository.javaMemberService.javaSpringConfig.java
스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술.SpringDataJpaMemberRepository.java (인터페이스)SpringConfig.java스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자
좋은 객체 지향 설계의 5가지 원칙SRP (Single Resposibility Pronciple) 단일 책임 원칙한 클래스는 하나의 책임중요한 기준은 변경. 변경 있을 때 파급 효과 적어야 SRP 잘 따른 것.ex) 객체 생성과 사용을 분리OCP (Open/Close
추석 전까지 김영한 jpa 기본, 다른 스프링, 스프링 부트 강의 듣고 추석때 할인하면 그 때 인프런 강의 사기.====https://youtube.com/watch?v=YSsl5-q2BR4&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlz
관계형 db - oracle, mysqlsql 중심 개발의 문제점.객체 vs 관계형 dbㄴ 둘이 다르다!상속연관관계객체는 참조 사용, 테이블은 외래 키 사용객체는 한 방향, 테이블은 양방향객체를 테이블에 맞춰 모델링객체답게 모델링 할수록 매핑 작업 늘어남객체를 자바 컬
Member 엔티티의 @NotEmpty는 화면에서 필요한 프레젠테이션 계층. 프레젠테이션 계층 위한 검증 로직이 entity에 다 들어가있음. -> 화면 validation 로직이 들어간 것. api마다 필요 할수도 필요 없을 수도 있음. entity 스펙을 nam
스프링 데이터 jpa리포지토리에 구현 클래스 없이 인터페이스 만으로 개발 완료 가능기본 crud 기능 모두 제공선택 아닌 필수jpa 많은 부분 자동화, 추상화\-> 먼저 jpa에 대해 잘 알아야 함!
Builder 패턴이란? 생성자에 인자 많을 때 사용 어떤 필드에 어떤 인자 넣어줬는지 명확히 알 수 있음 넣을 필요 없는 필드(null)은 굳이 선언할 필요 없음. ㄴ 그런데? 필드에 null 들어간다는 것 명확히 볼 수 있는게 좋다는 의견도 있음. @Builder 어노테이션 사용 1. 빌더 패턴 사용하지 않는 예 2. 빌더 패턴 사용 예 클래스 ...
\- JSON 직렬화 (serialization)JSON.stringify(JSON 형식의 객체)JSON 객체 -> 문자열 로 변환통신시에는 직렬화 하여 문자열로 주고 받는 것이 안전\- 역직렬화 (deserialization)JSON.parse(JSON 형식의 문자열
Dependency Injection (의존성 주입)의존 관계란? A가 B를 의존한다 -> B가 변하면 A에 영향을 미친다.의존 관계를 인터페이스로 추상화 -> 다양한 의존관계, 실제 구현 클래스와 관계 느슨해지고 결합도 낮아짐.DI : 의존 관계를 외부에서 결정하고
IoC (Inversion of Control) 제어의 역전메소드나 객체 호출을 개발자가 결정하는 것이 아니라 외부에서 결정하는 것.스스로 의존성 객체 만드는 것이 아닌 제어권을 스프링에게 위임해, 스프링이 만들어 놓은 객체를 주입!
싱글톤 패턴 클래스의 인스턴스가 딱 1개 만 생성되는 디자인 패턴 객체 인스턴스 2개 이상 생성 막아야 함. private 생성자 사용해 외부에서 임의로 new 사용 막아야 함. 요청 올때마다 객체 생성하는 것이 아니라, 이미 만들어진 객체 공유해 효율적으로 사용. 문제점 코드 많이 소요 클라이언트가 구체 클래스에 의존 -> DIP 위반 ㄴ 구체 클래스...
Bean Scope빈이 존재할 수 있는 범위보통 스프링 빈은 스프링 앱 구동 시 ApplicationContext에서 한번에 생성 -> 하나의 클래스는 한 개의 빈만 갖는다(Singleton).때에 따라서 http 요청마다 다른 빈 생성해서 쓸건지 ..스프링은 다음과
스프링 ioc 컨테이너는 빈 객체 의존성 관리.객체 관리 -> 객체의 생성무터 소멸까지 생명주기(life cycle) 관리를 개발자가 아닌 컨테이너가 해준다는 뜻.객체 관리의 주체가 프레임워크가 되니까 개발자는 로직에 집중할 수 있음.빈 생명주기 콜백콜백 : 특정 이벤
빈 스코프 중에서 가장 넓은 범위를 가진 스코프는 무엇인가요? 기본 스코프인 싱글톤 스코프. 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프싱글톤으로 적합한 객체의 특징은 무엇인가요? 상태가 없는 공유 객체, 읽기 전용 상태 가진 객체싱글톤으로
컴포넌트 스캔 (Component Scan) : 스프링이 스프링 빈으로 등록될 준비 된 클래스들 스캔해 빈으로 등록해주는 과정. @Component 가진 모든 대상 가져와서 빈에 등록하기 위해 찾는 과정. 컴포넌트 스캔이란? : 빈 객체를 컴포넌트 클래스에 구현하면 앱 실행 시 스프링이 컴포넌트 클래스들을 탐색하고 빈 객체들을 컨테이너에 등록하는 방법. ...
JPA와 ORMJPA : 자바 orm 기술에 대한 api 표준 명세.jpa는 orm 사용위한 인터페이스 모아둔 것.ORM (object relational mapping) : 객체와 db의 테이블이 매핑을 이루는 것.즉 내가 코드 상에서 생성한 객체가 db상에 어떤 테
영속성 컨택스트엔티티 영구 저장하는 환경.엔티티에 대한 캐시라고 생각.애플리케이션과 db 사이 객체 보관하는 가상 db 같은 역할엔티티 매니저 통해 엔티티 저장/조회 시 엔티티 매니저는 영속성 컨택스트에 엔티티를 보관/관리.영속성 컨텍스트의 특징 (https:
객체와 관계형 db 테이블이 어떻게 매핑되는지 이해하기! 객채 연관관계와 db 테이블 연관관계 비교 |객체 | db 테이블 | | :--- | :---: | | 참조(주소)로 연관관계 맺음 | fk로 연관관계 맺음 | | 참조를 사용하는 객체의 연관관계는 단방향 | db 테이블의 연관관계는 양방향 | 방향 : 단방향, 양방향 db 테이블은 외래키 하...
Cascade (영속성 전이) : 특정 엔티티 영속 상태 만들 때 연관된 엔티티도 함께 영속 상태 만드는 경우 부모 엔티티 저장 시 자식 엔티티 함께 저장 jpa에서 엔티티 저장 시 연관된 모든 엔티티는 영속 상태여야 함. Parent 엔티티에 @OneToMany
AWS EC2 부하 생성을 위한 Stress모듈 ec2 접속 후 epel repo 활성화 시킴. Stress 도구를 설치 Stress 명령의 Syntax 특정 함수를 실행시키면서 CPU, I/O, Memory, HDD에 부하를 줄 수 있다. Stress 실행
김영한님의 답변 안녕하세요. LUA님^^ 드디어! 막판까지 오셨군요 ㅎㅎ 사실 단순한 기능은 스프링 데이터 JPA로 정리하고, 좀 복잡한 쿼리가 있을 때 JPQL이나 Querydsl 둘중 하나를 고민하게 됩니다. 동적쿼리라면 사실 고민할게 없이 그냥 Querydsl을 사용하면 됩니다. 그런데 정말 단순한 쿼리 하나 둘 정도 JPQL로 작성해야 하는 상황...
AWS RDS RDS란? Relation Data Service의 약자로, AWS에서 제공하는 rdb 서비스이다. AWS에서 EC2를 구축했을 때 EC2안에 db(mysql)을 설치하고 사용할 수도 있지만, EC2에 문제가 생기면 db에도 접근하지 못한다는 등의 문제
WebSocket 웹 소켓 -> 전이중 통신 채널 제공해 "실시간성" 보장할 수 있음 HTTP vs WebSocket http에서도 실시간성 보장하는 듯한 기법 존재. polling, streaming 등과 같은 기능. 클라이언트가 서버에게 지속적으로 요청을 보낸다
n+1 문제 : 스프링 JPA와 같은 ORM 기술을 사용하면서 발생하는 성능 이슈 중 하나. 연관 관계가 있는 엔티티를 조회할 때, 쿼리 한 번으로는 해결할 수 없고, 추가로 n 번의 쿼리가 더 발생하는 문제. 예를 들어, 게시판에 글을 조회하는 기능을 구현한다고
https://velog.io/@soyeon207/QueryDSL-Spring-Boot-에서-QueryDSL-JPA-사용하기 entity 클래스와 매핑되는 querydsl Q클래스 객체 querydsl은 컴파일 단계에서 엔티티를 기반으로 Q클래스를 생성하는데 JPAA
AOP (Aspect-Oriented Programing) : 관점 지향 프로그래밍 OOP (객체 지향 프로그래밍)을 보완하는 수단으로, 흩어진 Aspect를 모듈활 할 수 있는 프로그래밍 기법이다. 흩어진 관심사, 횡단 관심사 (Crosscutting Concer
연관 관계의 주인이 누구인지 잘 생각해보자! https://www.youtube.com/watch?v=brE0tYOV9jQ https://github.com/bluesun147/springMapping
@JsonIgnore : 객체 JSON으로 직렬화할 때 해당 필드를 무시하도록 지정하는 데 사용됨. 즉 데이터에 아예 포함 안됨. Java 객체에는 불필요한 필드 JSON 직렬화에 포함하면 성능 저하, 전송된 데이터의 크기를 불필요하게 늘릴 수 있음. @JsonIgnore 어노테이션은 이러한 불필요한 필드를 무시하여 JSON 직렬화를 더 효율적으로 만들어...
@RequestBody와 @ModelAttribute 둘 다 클라이언트에서 보낸 데이터(JSON 등)를 오브젝트로 만들어 줌.But 세부 수행 동작에서 크게 다르다. 프로젝트 도중 이 둘 때문에 많은 에러 발생한 경험,,클라에서 보낸 HTTP 요청 본문(JSON)을 자
https://dev.exd0tpy.xyz/entry/Spring-Boot-CORS-설정하기https://wonit.tistory.com/572
Spring Security 인증과정 http request가 서버로 넘어온다. 제일 먼저 AuthenticationFilter가 요청을 받게 된다. 필터에서 request의 Username, password로 UsernamePasswordAuthenticationT
POJO(Plain Old Java Object) 테스트 특징: POJO 테스트는 스프링 프레임워크에 의존하지 않는 순수한 자바 객체를 테스트하는 방식. 주로 단위 테스트를 작성하는 데 사용. 테스트 대상이 되는 클래스나 메소드를 직접 인스턴스화하고 호출하여 테스트. 외부 의존성은 모의 객체(Mock Objects)를 사용. 사용 시기: 스프링 부트나 스...
WebSocket과 STOMP만을 이용한 채팅 구현은 몇가지 문제 존재.서버 시작마다 정보 리셋 -> DB로 Redis 이용.채팅 서버 여러대일 경우, 서버간 채팅방 공유 불가능채팅방을 WebSocket과 STOMP pub/sub으로 구현한 경우 pub/sub이 발생한
테스트 속도 @SpringBootTest 사용하면 실제로 애플리케이션 컨텍스트를 로드하여 테스트를 실행해야 함. 즉 애플리케이션의 모든 구성 요소를 초기화하고 시작해야 한다는 의미이다. 따라서, 애플리케이션 컨텍스트를 로드하는 작업은 상당한 시간이 소요될 수 있으며, 테스트의 실행 속도를 느리게 할 수 있다. 의존성 관리 @SpringBootTest는...
Spring Boot profiles은 애플리케이션을 실행할 때 환경 설정을 구분하여 관리할 수 있는 기능.프로파일은 애플리케이션을 특정 환경에 맞게 구성하고 설정을 선택적으로 활성화하는 데 사용. 이를 통해 개발, 테스트, 운영 등 다양한 환경에서 동일한 애플리케이션
메시지 큐(Message Queue) : 애플리케이션 간에 비동기적으로 메시지를 교환하는 소프트웨어 패턴. 메신저 특성 상 사용자 많아지고 채팅 양 늘어나면 대용량 데이터 실시간으로 전달해야 하는데 기존의 동기식 요청-응답 방식에서의 문제점을 해결하기 위해 pub/su
MSA : Micro Service Archiecture 작고 독립적으로 배포 가능한 각 기능 구행하는 서비스들로 구성된 프레임워크. 완전 독립적 배포 가능. 다른 기술 스택 사용 가능. Monolithic Architecture Monolithic Architec
of와 from은 DTO 생성, 변환시에 주로 사용되는 메소드 패턴.of 메소드는 보통 정적(static) 메소드로 구현되며, 여러 개의 인자를 받아 DTO 객체를 생성하는 역할. 주로 생성자에 필요한 인자들을 파라미터로 받아서 DTO 객체를 생성하는 용도로 사용. 이
Usermysql에서 테이블을 truncate 했어.그 후 새로운 데이터를 삽입했는데 id가 1이 아니라 이전에 있었던 id 다음 수가 들어가. 이유가 뭐야?스프링을 사용했고 id는 @GeneratedValue(strategy = GenerationType.SEQUEN
서버가 디비에 연결할 때 커넥션 비용이 가장 크다 커넥션 풀은 디비와 연결된 커넥션 미리 만들고 이를 pool 처럼 관리하는 것 미리 디비와 연결시킨 상태 유지하는 기술. 쓸때만 가져다보기 미리 만들
https://www.youtube.com/watch?v=amTJyIE1wO0 기본적 은행 -> 모노리식 (Monolithic) 은행 최초 msa 전환기 코어 뱅킹 시스템을 왜 마이크로 서비스로 전환하게 되었을까? 은행에는 크게 현재 은행 시스템 크게 2개 서버 중심 아키텍쳐 채널계 : 고객 요청 코어뱅킹 서버로 전달 코어뱅킹 (계정계) : 금원 ...
REST, gRPC, 그리고 GraphQL은 각각의 특징과 목적에 따라 선택되는 다른 API 프로토콜입니다. 아래는 이 세 가지를 비교한 내용입니다. REST (Representational State Transfer) 간단하고 직관적: REST는 HTTP 기반으로 동작하며, 자원을 URI로 표현하고 HTTP 메소드로 조작하는 간단하고 직관적인 아키텍처...
Lombok 생성자 관련 어노테이션 예시 Customer 객체 @NoArgsConstructor 파라미터 없는 기본 생성자 초기화 항상 필요한 final 붙은 필드 있을때 @NoArgsConstructor 사용 시 에러. @NoArgsConstructor(force = true) 옵션 사용하면 모든 final 필드는 0, false, null로 초기화...
F.I.R.S.T Principles 클린 코드의 저자 Bob Martin이 제시한 좋은 단위 테스트를 위한 규칙. Fast 유닛 테스트는 빨라야 함! 빠르기 위해서 실제 서버데 db 이용 X, mock 데이터 만들자. Independant 독립적. 유닛 테스트 그 자체만으로 실행되어야 함. 다른 테스트에 의존, 영향주면 안됨. Repeatable ...
Test Double 테스트 목적으로 사용되는 실제 객체의 대역 dummy : 객체 전달되지만 실제로 사용하지는 x. 매개변수 채우는 역할 fake : 실제 작동하는 구현 있지만 실제 프로덕션에 적합하지 않은 지름길 사용. ex: 메모리 db stub : 호출에 이미 준비된 답변 제공. 그 이외는 응답 x spy : 어떻게 호출받았는지 일부 정보 기록하는...
No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer 1:N 연관관계에서 지연 로딩(lazy)을 사용하는 경우 발생할 수 있는 에러. 지연 로딩의 경우 필요...
repository, repositoryCustom, repositoryImpl 구조 하나의 리포지토리로 JpaRepository, QueryDSL 기능 모두 사용할 수 있음. ExRepository (interface) : JpaRepository 기능, Custom도 extend ExRepositoryCustom (interface) : ExRepo...
ArgumentCaptor 단위 테스트 중, 메소드에 들어가는 인자 값 중간에 가로채서 검증하고 싶을 때 사용하는 Mockito의 클래스 메소드 호출에 전달된 객체를 추출할 수 있다. capture() 메소드 : 특정 메소드에 passed된 argument를 얻을 수 있음. 해당 코드에서는 save() 메소드에 들어간 인자를 가로채서 검증. getA...
@SpringBootTest AppliationContext에 모든 Bean 등록. 스프링부트 어플리케이션 실행했을 때와 동일하게 컨테이너에 Bean 등록. @configuration 통해 수동 등록한 Bean + 컴포넌트 스캔 통해 @Component 달려있는 모든 Bean 다 등록. @DataJpaTest 오직 JPA 컴포넌트 테스트 위...
mock과 spy mock mock 객체는 해당 클래스의 행동(behavior) 가지지 못함. 직접 지정하지 않으면 (when(), thenReturn()) 수행하는 모든 행동은 디폴트 값. spy spying은 지정한 클래스의 행동 그대로 갖는다. when()
Thread Safe(스레드 안전) 멀티 프로세스 프로프래밍에서 어떤 필드에 여러 스레드로부터의 동시 접근이 이뤄져도 프로그램 실행에 문제가 없음을 뜻함. 즉 동시성 문제가 발생하지 않는 안전한 동작을 의미. Thread Safe 지키기 위한 방법 Re-entran
동시성 문제 (Concurrency Issue) 여러 스레드가 동시에 같은 인스턴스 필드에 접근시 발생하고, 트래픽 많을 시 주의해야 함. 스프링은 싱글톤으로 스프링 빈을 등록하기 때문에 동시성 문제를 조심해야 한다. 재고 관리, 금융 업무 처럼 여러 스레드에서 공
@Transactional 스프링은 트랜잭션 처리를 위해 선언적 트랜잭션을 사용. 선언적 트랜잭션은 설정 파일 또는 어노테이션 방식으로 트랜잭션에 관한 행위를 정의하는 것. 나의 경우 대부분의 프로젝트에서 @Transactional을 사용했다. @Transaction
리액티브 프로그래밍 위한 모듈. 비동기 논블로킹 메시지 처리. Spring MVC MVC는 기본적으로 블록킹, 동기 방식 사용. 기존 서블릿 기반 스프링은 Tomcat 사용. MVC도 비동기 방식으로 처리할 수 있지만, 스펙에 의해 제한 있고 기본적으론 동기 방식
NIO Java New Input/Output의 약자로 기존 자바의 IO 방식보다 효율적이고 스케일 가능한 IO 작업 처리 위한 API. 기존 IO와의 차이 비동기 버퍼 기반 데이터 전송 방식으로 IO 성능 크게 향상. 기존 IO 보다 나은 멀티스레딩 기능 제공. (논블로킹) Tomcat과 NIO Tomcat은 NIO 커넷터 통해 사용자의 요청 받음....
정해진 시간마다 알림 메시지을 보내는 기능을 구현하자. 메시지 생성과 메시지 전송 스레드를 각각 구분해 작업을 분리 -> 메시지 큐를 직접 구현해보자. 메시지 큐와 메시지 컨슈머 메시지 컨슈머가 메시지 큐에서 메시지 꺼내와서 처리. 큐에 메시지 들어있는지 매 초마다
Netty 비동기 이벤트 기반 저수준 네트워크 프레임워크 Netty의 특징 비동기 입출력 블로킹, 논블로킹 소켓 둘 다 지원 저수준 제어 채널, 이벤트 루프 등 직접 제어해 고도의 커스터마이징 가능. 기존 프로토콜 사용하지 않고 새로운 프로토콜 구현해야 하는 경우.