본문 바로가기

Spring

(38)
Embedded Redis 설정 Embedded Redis 설정 /** * 로컬 환경일경우 내장 레디스가 실행 */ @Profile("local") @Configuration public class EmbeddedRedisConfig { @Value("${spring.redis.port}") private int redisPort; private RedisServer redisServer; @PostConstruct public void redisServer() { redisServer = new RedisServer(redisPort); redisServer.start(); } @PreDestroy public void stopRedis() { if (redisServer != null) { redisServer.stop(); } }..
Redis(레디스) 항해 58일차 2022.03.08 Redis를 사용해서 채팅 내용을 저장 하려고 했으나 멘토님의 조언으로 채팅 내역은 DB에 저장하고 채팅 참여 인원수에 Redis를 사용해보기로 했다. Redis Key-value의 비정형 데이터로 구성해 저장, 관리하기 위한 비관계형 데이터베이스 관리 시스템 모든 데이터를 메모리로 불러와서 처리하는 메모리 기반 DBMS 장점 List, Array데이터를 처리하는데 효과적이다. tring, List, Set, Hash , Sorted sets 등 여러 데이터 포맷을 지원하여 다양한 방식의 데이터 활용이 가능 원자성 보장을 위한 처리 함수를 제공한다. 여러 프로세스에서 같은 데이터를 요청 시 , Atomic 처리를 하기 위한 전용 함수를 제공 메모리를 활용하면서도 영속적인..
WebSocket_2 채팅 고도화 ChatMessage 채팅 메시지를 주고받기 위한 DTO @Getter @Setter public class ChatMessage { // 메시지 타입 : 입장, 채팅 public enum MessageType { ENTER, TALK } private MessageType type; // 메시지 타입 private String roomId; // 방번호 private String sender; // 메시지 보낸사람 private String message; // 메시지 } ChatRoom 채팅방을 구현하기 위한 DTO 채팅방은 입장한 클라이언트들의 정보를 가지고 있어야 하므로 WebsocketSession 정보 리스트를 멤버 필드로 갖는다. 채팅방은 입장,대화하기의 기능이 있으므로 hand..
S3로 파일 업로드 마지막 프로젝트를 진행중이며 유저가 업로드 하는 이미지 파일을 S3 클라우드에 저장하는 방식을 사용헤보기로 했다. 먼저 AWS S3 Bucket을 생성하고 코드 구현을 했다. S3 버킷 생성 S3에서 버킷 만들기 클릭 1) 버킷 이름과 리전 설정 버킷 이름은 고유값으로 설정 2) 퍼블릭 액세스 설정 ※ 외부에 S3을 공개할 경우 모든 퍼블릭 액세스 차단을 체크 해제하고, 공개하지 않는다면 체크를 해주면 된다. 3) 버킷 정책 생성 버킷 생성까지 완료 되었으면 외부에서 접근이 가능하도록 버킷 정책을 설정해줘야 한다. 생성된 버킷명을 클릭해서 들어가면 아래와 같은 탭이 있는데 [권한] 탭을 클릭해서 들어가면 버킷 정책이 있다. 편집으로 들어가자. 정책 생성기를 클릭하고 설정해야한다. (버킷 ARN은 복사를 ..
트랜잭션의 ACID란? 항해 46일차 이전 글에서 트랜잭션에 대해서 찾아봤고 데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있다. ACID? ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안정성을 보장하기 위해 필요한 성질이다. ACID속성 트랜잭션을 정의하는 4가지 중대한 속성을 가르킨다. 원자성(Atomicity), 일관성(Consistency), 격리(Isolation), 영속성(Durability) 을 의미한다. 데이터베이스 작업에 이러한 ACID속성이 있다면 ACID트랜잭션이라 부르고 이런 작업을 적용하는 데이터 스토리지 시스템을 트랜잭션 시스템이라고 한다. ACID 트랜잭션은 한 테이블의 읽기, 쓰기, 수정 작업이 각각 아래와 같은 속성을 가지고 있다고 보장해준다. 원자성(Atomicity) - 트랜잭..
트랜잭션(Transaction) 항해 45일차 트랜잭션이란? 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위 데이터베이스의 상태를 변경시킨다는 이야기는 SELECT, UPDATE, INSERT, DELETE 와 같은 행동 이런 트랜잭션은 상황에 따라 여러 개가 만들어질 수 있다. 그 하나의 트랜잭션은 Commit (저장) 되거나 Rollback (철회)될 수 있다. 예로 리뷰를 작성하면 포인트를 받는다고 가정해보자. A,B,C,D가 각각 리뷰를 작성하면 1,000포인트를 지급 해야하고 이를 DB에 저장해야한다. 그런데 A,B,C는 정상적으로 저장이 되었고 D는 저장에 실패했다. 이런 상황은 잘못된 처리이므로 다시 저장을 수행해야 하는데 A,B,C는 이미 저장이 완료되었기에 다시 저장을 하면 2,000포인트가 저장이 된다. 이런..
SQL vs NoSQL 항해를 처음 시작하면서 NoSQL인 MongoDB를 사용했었다. Spring을 접하게 되면서 자연스럽게 SQL인 MySQL을 사용했는데 오늘에서야 두가지의 차이점과 장단점을 알아보았다. SQL(관계형 데이터베이스) SQL은 '구조화 된 쿼리 언어 (Structured Query Language)'이다. 그러므로 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는 데 사용 하는 쿼리 언어다. SQL을 사용하면 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다. 특징 데이터는 정해진(엄격한) 데이터 스키마 (= structure)를 따라 데이터베이스 테이블에 저장 데이터는 관계를 통해서 연결된 여러개의 테이블에 분산 데이터는 테..
OAuth 2.0? 소셜 로그인? 팀에서 소셜로그인을 적용해보자는 의견이 있어서 개인 프로젝트 주차에서 카카오 로그인 구현을 해봤기에 관련 내용을 더 찾아보았다. OAuth란? 우리는 인터넷을 사용하면서 쇼핑몰등에서 회원가입 시 아래와 같은 이미지를 자주 접했다. Facebook, kakao, naver, Google 등의 외부 소셜 계정을 기반으로 간편하게 회원가입 및 로그인할 수 있다. 클릭 한번으로 간편하게 로그인할 수 있을 뿐만 아니라 연동되는 외부 웹 어플리케이션에서 Facebook, kakao, Naver, Google 등이 제공하는 기능을 간편하게 사용할 수 있다는 장점이 있다. 예로 naver로 로그인하면 API를 통해 연동된 계정의 캘린더, 연락처, 쇼핑내역을 가져와 사용자에게 보여줄 수 있다. 이때 사용되는 프로토콜이 ..
데이터 연관관계 항해 41일차 2022.02.19 1. 데이터 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키 를 관리할 곳을 지정해야함 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능 2. 다대일 단방향 다대일의 반대는 일대다 A,B 각 엔티티가 있다면 A는 A.b으로 B엔티티를 참조할 수 있지만 반대로 B에서 A를 참조하는 필드가 없다. 그렇기에 A와 B는 다대일 단방향 연관관계다. === A 엔티티 ==== @Entity public class A { @Id @GeneratedValue @Column(name = ..
[TIL] 항해99 Day 40 항해 40일차 2022.02.18 # 6. 엔티티 설계 시 주의점 ### 엔티티에는 가급적 Setter를 사용하지 말자 - Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거 ### 모든 연관관계는 지연로딩으로 설정 - 즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. - 실무에서 모든 연관관계는 지연로딩( LAZY )으로 설정해야 한다. - 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다. - @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 **지연로딩**으로..