일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Stomp
- 채팅구현
- 단위테스트
- spring
- 소켓통신
- 자바
- 스프링
- 반효경
- Security
- OS
- 소켓
- cs지식
- JPA
- jwt토큰
- MongoDB
- CS
- 스프링소켓통신
- Mock
- rabbitmq
- springboot
- jwt
- 테스트코드
- 기술면접
- 스프링부트
- socket
- 운영체제
- 자바문법
- CS면접
- java
- 스프링시큐리티
- Today
- Total
목록전체 글 (38)
Dev_Henry

상황현재 진행중인 프로젝트에서 사용자가 종료시간을 설정하여 과제를 생성할 수 있다.해당 종료시간이 되면 과제는 자동으로 종료상태가 돼야하기 때문에 스케줄링 처리가 필요했다. 기존 방식처음 구현한 방식은 @Scheduled 어노테이션을 활용하는 방법이었다.구글링을 통해 찾아봐도 스프링에서 스케줄링 처리를 하는 방법은 모두 해당 어노테이션을 사용하는 방법으로 설명한다. 하지만 여기에는 문제가 있었다.현재 요구사항은 사용자가 직접 종료시간을 설정해 과제를 생성하기 때문에, 스케줄링이 동작해야하는 시간이 고정되지 않았는데, @Scheduled로는 처리할 수 없었다. 간단하게 살펴보자면, 해당 어노테이션은 속성으로 스케줄링 시간을 설정할 수 있는데,fixedRate, fixedDelay 속성은 ms단위의 시간을 ..

최근 진행한 프로젝트는 학급관리가 가능하고 학생들끼리 소통을 도와주는 서비스이다.같은 반 친구들과 그룹채팅을 할 수 있는 기능이 있는데, 초등학생이 주요 타겟이다보니 비속어 필터링을 해주면 좋겠다는 의견이 나왔다. 처음에는 필터링 목록을 반복문으로 모두 돌면서 해당 단어의 일치를 검사하는 방식으로 구현했다.구현하기는 간단했지만, 필터링 목록이 커질수록 반복문을 모두 도는것이 성능적으로 나빠서 다른 방식을 찾아보던 중 '아호코라식 알고리즘'을 알게되었다.아호코라식 알고리즘이란 일대다 패턴 매칭 알고리즘으로, 찾아야하는 패턴의 갯수와 상관없이 원본 문자열 한번만 조회하면 포함된 모든 패턴을 찾아낼수 있는 알고리즘이다. 찾아야하는 패턴 목록을 트라이 자료구조로 만들고, 해당 트리와 원본 문자열을 매칭 검사한다..

최근 진행한 프로젝트는 '개인 경매 플랫폼' 이었다. 해당 서비스에서는 일반적으로 생각할 수 있는 '경매'도 물론 가능하고, '역경매'라는 서비스도 제공했다. '경매'는 다르게 말하면 '판매' 카테고리로 판매글을 올리고 경매시간이 되면 다른사람들이 경매에 참여할 수 있다. '역경매'는 반대로 '구매' 카테고리다. 구매하고싶은 물건을 올리면 다른사람들이 본인 물건을 어필하며 역경매가 진행된다. 이렇게 이번 서비스에서는 '판매'와 '구매'가 존재했고, 둘 모두 '거래'라는 공통점을 가지며 공통적으로 필요한 필드도 많이 존재했다. 중복이 많이 존재하면 공간의 낭비, 코드 중복, 개발자의 귀찮음 등 다양한 문제들이 생긴다. 문제를 인지를 했으니 이것을 어떻게 효율적이게 설계할지 고민해보았다. 위 사진은 프로젝트..

현재 deal은 image를 oneToMany로 가지고있음. public abstract class Deal { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @CreatedDate private LocalDateTime createTime; @LastModifiedDate private LocalDateTime updateTime; private String title; private String content; @ManyToOne(fetch = FetchType.LAZY) private Member writer; @Enumerated(EnumType.STRING) private Category category; @El..

현재 진행중인 프로젝트에서 하나의 이미지와 다른 값들을 받아서 방명록 객체를 만드는 api가 있다. 처음엔 다른 일반적인 요청을 받을때처럼 하나의 DTO를 정의해서 요청값으로 받았다. 다만 평소처럼 그냥 RequestBody를 적어주고 스웨거를 들어가면, 파일을 올릴수없고 다른 값들과 함께 Json 텍스트값을 입력받게 되어있는 것을 볼 수있다. 사진파일은 다른 값들처럼 JSON으로 보낼수 없다. 사진파일을 받기위해 MULTIPART_FORM_DATA 타입으로 요청을 받도록 했다. @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor public class GuestBookRequest { String n..

1. 스웨거 springfox 사용 불가 -> springdoc 사용 문법도 조금 바뀜. 2. spring security 6.2이상에서 설정 방법 변경 public final class HttpSecurity extends AbstractConfiguredSecurityBuilder implements SecurityBuilder, HttpSecurityBuilder { . . public HttpSecurity cors(Customizer corsCustomizer) throws Exception { corsCustomizer.customize(getOrApply(new CorsConfigurer())); return HttpSecurity.this; } . . } HttpSecurity를 구성할때,..

스프링 프로젝트를 만들면 application.properties 혹은 yml 파일에 각종 설정 정보를 입력하게 된다. 이 정보에는 api key, db 접속정보 등 보안정보도 포함되기 때문에 그대로 Git과 같은 온라인상에 올려버리면 낭패를 겪게된다. 이런 문제를 해결하기 위한 방법으로는 암호화 라이브러리를 사용하여 암호화하는 방법과 해당 정보를 다른 파일로 분리하고 gitignore에 추가하는 방법이 있다. 나는 정보를 다른 파일로 분리하는 방법을 사용할 것이고 git에 공개된 설정파일에서도 대략적인 코드 구성을 파악하기 쉽도록 해당 '보안데이터' 만 분리 할 것이다. 스프링 프로젝트를 할 때 항상 properties만 사용했는데 이번에는 yml파일을 사용해보고싶어서 처음으로 시도했고 yml에서는 설..
우테코 프리코스를 진행하다보면 배워갈게 많다고 해서 프리코스를 진행중이다. 과제의 요구사항이 적다보니 1주차는 별 생각없이 구현을 했었는데 사람들을 보니 전부 MVC패턴으로 구현하고 있더라.. 그래서 2주차는 나도 좀 분리를 해서 작성했는데, 음 여전히 요구사항 자체가 별로 없다보니 굳이 잘게잘게 분리하는게 비효율적으로 느껴져서 적당한 크기로만 분리했었다. 그리고 이번 3주차 과제는 좀 더 본격적으로 분리를 하려고 했다. 분리를 하는김에 spring을 흉내내서 각각 객체들을 싱글톤으로 관리하고, 처음 프로젝트를 돌릴때 의존성 주입방식으로 생성해주면 더욱 효율성 좋고 유지보수가 편리하도록 만들 수 있을것 같아서, 이렇게 진행하려한다. 보통 싱글톤을 간단하게 구현하는 방식으로는 lazy initializat..

이제까지 프로젝트를 하면서 값을 주고 받을 때 다양한 방법으로 객체와 데이터를 매핑시켰다. 그런데 구체적으로 어떻게 매핑이 되는지 이해하지 못한 상태로 사용하다보니 종종 에러가 발생하는 경우가 있었기 때문에, 이에 대해서 공부해보려 한다. 우선 objectMapper와 modelMapper를 알아본 뒤에 아래에서 간단한 테스트도 진행해 보겠다. 우선 객체 데이터를 json으로 주고받을때 많이 사용하는 objectMapper. @RequestBody는 내부적으로 objectMapper를 사용한다. 스프링 부트에서는 기본적으로 jackson이 내장되어있고, 여기에 objectMapper클래스가 있다. 직렬화를 할때는 getter를 통해 필드 값을 알아내고 값을 내보낸다. 즉 getter가 필요하다. (맴버변..
spring을 이용한 캡스톤 프로젝트 진행 중 요구사항 중 채팅 기능이 있었다. 이를 구현하기 위해 spring에서 webSocket과 stomp를 사용해 구현했다. 이때 기본 내장 브로커는 안정성, 확장성 측면에서 단점이 많아 외부 브로커를 도입했다. (장애 발생시 메시지 유실, 수용가능한 세션 크기 제한, 모니터링이 어려움, 서버 분리,확장이 안됨) 찾아보니 많이 사용하는 것들이 아래의 3개이기 때문에 각각의 특징을 알아보려고 한다. 우선 아래의 세가지 모두 비동기 메시지를 사용하는 서비스들 사이에서 데이터 송수신을 의미하는 MOM(메시지 지향 미들웨어)를 구현한 메시지큐이다. 메시지 큐의 특징으로는 큐를 사용한 비동기 처리 어플리케이션과의 분리 실패에도 전체에 영향을 주지 않음 여러 프로세스가 큐에..