일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
31 |
- java 백준 1509
- 백준 특정한 최단 경로
- kotiln const
- ipfs singletone
- nodejs rabbitmq
- 익명 객체 @transactional
- rabbitmq 싱글톤
- 백준 2252 줄세우기
- ipfs bean
- 백준 1504 java
- mongodb lookup
- 자바 백준 팩토리얼 개수
- 자바 1676
- Java Call By Refernce
- go
- Spring ipfs
- 전략 패턴이란
- java 팩토리얼 개수
- spring mongodb switch
- spring mongoTemplate
- java 1509
- 안정해시
- javav 1676
- 백준 연결요소 자바
- spring mongoTemplate switch
- java 파티
- kotiln const val
- java 1238
- kotiln functional interface
- spring mongodb
- Today
- Total
목록web study (49)
공부 흔적남기기
개발 도중 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 을 사용하여 isDeleted를 is_deleted로 보냈는데 날라가는 메세지를 보니 deleted로 날라갔다. 찾아보니 직렬화 하는 도중에 is가 제거된다.. @get:JsonProperty("is_deleted") @param:JsonProperty("is_deleted") var isDeleted: Boolean? = false, 를 사용하면 is를 사용할 수 있다. 참고로 요즘 개발할 때에는 형용사 앞에 is 붙이는 걸 선호하지 않는다. 어차피 값은 true 혹은 false일 것이기 떄문.
Go를 이용해서 Rest Api를 개발하고 있는 도중 middleware를 사용할 일이 생겨 사용할려다보니 내부적으로 이해가 안되서 정리함. 어댑터 패턴은 간단하게 말해서 A타입을 사용하고 싶은데 우리에게 B타입밖에 없다면 어댑터를 이용해서 B타입을 A타입으로 바꿔주는 역할을 하는 것이다. Go에서 middleware를 사용하기 위해 Gorlia Mux의 router.Use라는 function을 사용할 건데 func (r *Router) Use(mwf ...MiddlewareFunc) { for _, fn := range mwf { r.middlewares = append(r.middlewares, fn) } } type MiddlewareFunc func(http.Handler) http.Handler..
JPA란? JPA는 ORM 기술 표준으로 객체를 관계형 데이터베이스 매핑해주는 기술입니다. JPA를 사용하는 이유 생산성 지루하게 짜던 반복전인 SQL을 JPA를 통해 대신 처리할 수 있습니다. SQL 중심적인 개발을 객체 중심으로 개발할 수 있습니다. 유지보수 SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 등록,수정,조회 SQL과 결과를 매핑하기 위한 JDBC API코드를 작성해야하는데 JPA가 대신 처리해주므로 유지보수해야 하는 코드수가 줄어듭니다. JPA 성능 최적화 기능 1차 캐시와 동일상 보장 (캐싱 가능) 트랜잭셕을 지원하는 쓰기지연(버퍼링 기능) 지연로딩 즉시로딩 패러다임 불일치 해결 JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해줍니다...
우리는 왜 그렇게 객체지향 코드를 짜기 위해 노력하는가? 회사A가 있다고 가정해보자 회사 A는 이제 막 시작한 스타트 업으로 코드에 변경과 수정에 대한 부담이 없고 빠른 결과를 원한다. 따라서 절차 지향적으로 빠르게 코드를 짜기 시작했고 좋은 성과를 얻게되었다. 좋은 성과에 따라 새로운 여러 비즈니스 요구사항들이 들어오기 시작했다. 시간이 갈수록 절차지향적으로 짠 코드를 변경/수정하는데 많은 비용이 들기 시작한다. 많은 비용을 줄이기 위해선 변경과 수정에 들어가는 비용을 줄여야한다. 그럼 변경과 수정을 줄이기 위해선 어떻게 해야하는가? 당연희 여러 방법이 있겠지만 대표적으로 객체지향적으로 코드를 짜면된다.! 간단히 말해 소프트웨어의 중심은 변화이다. 이 변화를 좀 더 쉽게 다가가기 위해선 객체지향적 코드..
단일책임원칙이란 SOLID 원칙에서의 S로 하나의 메소드, 클래스는 하나의 책임만을 가져야 한다는 원칙이다. 이번 프로젝트를하면서 SOLID원칙을 지키고자 했지만 사실 빨리 개발하느라 바뻐 SOLID원칙은 거의 지키지 못한것 같다. 이번 프로젝트에서 어떤 로직을 충족하면 점수를 주거나 알람을 보내는 로직이 있었다. 일정 로직이 충족되는 로직과 알람을보내거나 점수를 보내는 로직이 한 메소드 안에 들어있어 코드가 너무 복잡했고 절대로 남이 봐서는 이해할수 없을 것 같은 코드였다. 이에 대한 해결책으로 ApplicationEventPubliser을 이용해 Event를 만들고 EventListener를 통해 일정 이벤트가 충족되었을때 새로운 일정 로직이 시작되도록 하여 한 메소드를 이벤트 기준으로 나누었다. 즉..
이번에 새로운 프로젝트를 하면서 JPA를 사용하여 쿼리를 사용하였다. 맨처음 개발할때 아무생각없이 spring data jpa 인터페이스를 통해 마구잡이로 개발하여 n+1 문제가 안나오는 곳을 찾을수가 없었다. 그래서 N+1문제가 문제가 뭔데 N+1문제는 select문을 1개를 날리겠다는 의도로 쿼리를 했지만 추가로 N번의 쿼리가 생기는 문제이다. 이 문제는 entity간의 연관관계 때문에 일어나게 된다. N+1문제를 트러블 슈팅하기전에 먼저 FetchLazy와 FetchEager에 대해 알아보자 Lazy와 Eager의 설정은 하나의 엔티티를 select할떄 엔티티와 연관관계가 맺혀진 엔티티를 어떻게 처리할 것인지 정하는 설정이다. Eager로 설정하게 되면 연관관계가 맺혀진 모든 엔티티를 한번에 다 가..
프로젝트를 하면서 유저들간 실시간 채팅방이 필요해 WebSocket,Stomp,Redis를 활용하여 채팅방을 구현하였습니다. 간단한 구조를 먼저 설명하자면 프론트쪽에서 HTTP를 통해 소켓연결을 하면 소켓 프로토콜이 연결되면서 실시간으로 서버와 클라이언트가 연결되게 된다. 클라이언트는 Request가 없어도 Response를 받을 수 있는 구조를 가지게 된다.간단히 순서를 알아보면엔드포인트에 프론트가 소켓통신을 위한 신호를 보내 서버가 OK신호를 보내면 소켓 connect가 된다.connect가 되면 프론트가 subscribe destination과 유저정보를 가진 요청을 보내고 데이터가 올떄까지 기다린다.앞으로 데이터를 subscirbe destination에 받는다.클라이언트는 send를 통해 pub..
Spring MVC에서 Kakao 소셜 로그인 하는 과정부터 간단히 보면 html 단에서 location.href를 통해 카카오 로그인 인증 코드를 받을 수 있는 URL로 이동한다. 코드를 받으면 미리 설정해 놓은 redirect_url로 돌아오는데 이때 Controller로 이 url을 잡는다. 잡았을때 @RequestParam에서 code가 들어가있다 code를 저장한다. code를 이용해 HttpRequest 를 만들어 kakao인증 페이지에 보낸다. 만약 code가 인증에 성공했다면 접근할 수 있는 JWT 토큰을 부여받는다. 다음 요청에 JWT토큰을 이용해 HttpRequest를 보낸다. 토큰이 알맞으면 카카오 로그인을 한 user의 정보를 받는다. 이제 순서대로 코드로 살펴보면 html 단에서 ..
SpringSecurity에서 .formlogin을 이용하여 로그인을 할때 실패시 .failureUrl을 사용하면 Controller에서 redirect된 Url을 못잡는 문제가 발생하였다. 어떤 이유인지는 정확히 모르겠지만 잡히지 않는 문제가 생겨 .failHandler를 사용하는 방식으로 해결하였다. .failHandler는 AuthFailureHandler 객체를 매개변수로 입력받는데 우리는 AuthFailureHandler 구현체를 만들어fail 로직을 만들어주면된다. 로직은 간단하다. @Component public class AuthFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthentica..
CORS는 SOP를 기반으로 하고 있기 때문에 SOP를 먼저 이해해야한다. SOP는 Single Origin Policy의 약자로 간단히 말하면 동일 출처 정책이다. 하나의 Origin을 정해놓고 Orgin과 동일한 출처의 리소스만 상호작용을 허용하는 정책이다. Origin은 URI스키마, Hostname, port로 이루어진다. SOP를 사용하는 이유는 만약 클라이언트가 브라우저에서 한 사이트에 로그인을 한후 쿠키에 로그인 인증에 필요한 값을 저장한후 같은 브라우저에서 악성사이트에 접속하게되면 악성사이트가 로그인페이지에 요청을 보내 정보를 털 수 있다. 하지만 SOP는 같은 Origin만을 허용해주기 때문에 악성사이트에서 보낸 요청에는 CORS에러가 작동하도록 한다. CORS란 Cross Origin ..