어떤 유저가 회원가입을 하거나 수정을 했을 때 메일을 발송해야하는 기능을 구현해야했다. @TransactionalEventListener를 이용하여 이 것을 해결했는데 기본 코드는 작년 프로젝트 코드를 참고 하였고, 메일을 발송하는 기능 자체는 회사 내부 다른팀의 api(외부 api)를 이용하였다. 흐름 자체는 외부 api를 통해 메일 내용을 등록해놓는 것이었고, 내부 코드에서는 CRUD가 일어났을 때 EventListener가 실행될 수 있도록 되어있었는데, 이 부분에서 작은 문제가 생겼다. @Override public UserDto createUser(LoggedInUser loggedInUser, RequestUserDto request) { UserEntity originUser = userRe..

창천향로님의 블로그를 보며 내가 이해한 것을 기반으로 aop를 그려보았다. 실제로는 아직 구현해본 적이 없으므로 미리 작성된 코드를 봤고, 학원 동기와의 토론을 통해 이해한 것이다. Aop? 과거 MSA 기반으로 모듈 설계를 한 적이 있다. 큰 기능을 중점으로 모듈을 나눴는데 예를 들면 한 api에서 캘린더 기능과 TodoList의 기능이 있다고 한다면 캘린더, todoList 그리고 중앙의 연결고리를 해줄 common까지 3개의 모듈로 나뉘게 된다. 즉 하나의 인프라를 기반을 둔 api의 기능을 나누는 것인데 aop는 비즈니스 로직을 기반으로 둔 기능을 나누는 것이다. 말하자면 로그인 기능을 매번 모든 Controller에서 로직으로 처리해야 할 때 이 로그인 기능을 aop로 만들어 분리하는 것으로 코..
현재 사전과제 진행 중에 flyway라는 기술을 접하게 되었다. 개념적인 부분은 사전과제 제출 후 다루기로 하고 고생했던 부분부터 적어둘 예정이기에 이번 글은 짧을 예정이다. gradle 기반이기에 build.gradle에서 dependencies 추가 대신 plugins에 id "org.flywaydb.flyway" version "6.0.1"를 추가 후 맨 하단에 flyway 설정을 해주는데 url, user, password 등 필요한 것을 추가한 뒤 gradle을 import 한다. 기본 설정이 끝났다면 IntelliJ Terminal에서 ./gradlew flywayMigrate를 추가하여 DB에 flyway_schema_history tables를 생성한다. 이 기술을 처음 접했을 때 스키마를..
텀블벅 사전 과제 프로젝트 작업 중 QueryDsl이라는 것을 접하게 되었다. jpa에서 Repository를 생성할 때, CrudRepository 혹은 JpaRepository implements 받는다. 객체로 DB를 다루는 JPA 특성상 Entity로 지정된 Class로만 CRUD가 가능한데 내가 하고 싶었던 것은 지정된 Entity가 아닌 DTO로 반환받는 것이었다. DTO로 반환받는 방법 중 그 당시 생각한 방법을 간략하게 나열해보자면 아래와 같다. 1. Entity로 반환받은 뒤 반환된 값으로 DTO를 생성한다. 2. Repository가 아닌 Query문을 작성한다. 3. @Query 어노테이션을 사용한다. 1번은 불필요한 데이터를 호출해야 한다는 점 2번은 Query문을 작성하여 적용해도..
전에 다니던 회사에서 Spring boot와 jsp를 사용하는 API 유지보수를 했다. Spring boot와 Hibernate만 다루던 내가 Mybatis를 배울 좋은 기회였고, Query를 직접 짜며 DB에 관한 관심도 더욱 깊어질 수 있었다. 직접 체험해보고 느낀 점을 적기 전에 간략하게 API에 관해 설명하자면 Spring boot 1.5 이하 버전과 jsp, Maria DB 기반이며 N개의 모듈은 Util 모듈과 연결되어 있다. Spring boot와 jsp의 문제점 - Tomcat 유지보수를 시작한 뒤 제일 먼저 난관에 부딪히게 된 것은 Tomcat의 설정 문제였다. Spring boot은 자체적으로 Tomcat 설정을 제공하는데 JSP만은 제공을 하지 않는다. 이게 무슨 문제가 되는가? 하는..

이력서를 완성하고, 면접 본다고 오랜만에 정리하게 되었다. 코딩 테스트로 Oath 2를 이용한 로그인 시스템을 구현하게 되었는데, 앞으로도 종종 사용할 것 같으니 잊어버리기 전에 정리하기로 하겠다. 흔히 볼 수 있는 Naver, Google 등의 계정으로 특정 웹 혹은 앱에 로그인 하는 것이 Oath 2이다. 그 외에도 API를 가져와 사용할 수 있는 표준 기술이며 구현하기도 까다롭고, 보안상의 문제로 인해 Spring boot 나 API를 제공하는 서버는 SDK를 제공해주니 참고해서 만들면 된다. 참고로 이해 안하고 SDK만 가져다 쓰면 나중에 확장할 때 매우 격하게 삽질할 수 있으니 Oath 2의 구동 방식을 반드시 이해하길 추천한다. 1. Client는 특정 Server에서 제공하는 어떠한 데이터를..

project를 진행하면서 @Autowired와 @Resource, @Inject에 대해 알아보았다. 근데 아무리 생각해도 궁금증이 남아 머리에서 재생되며 튀어나오길래 이야기를 나눠봤다. 주제 @Autowired와 @Resource의 장단점과 왜 spring에서는 @Inject를 대신하는 @Autowired는 제공하는데 @Resource를 대신하는 어노테이션은 없는 것인가? 뭔가 장단점은 모르겠으나 정리해보자면 "@Resource가 @Autowired보다 먼저 나왔다는 것이고 @Resource가 좀 더 무결하다는 느낌이 든다." "@Autowired spring bean에서 같은 type이 있으면 알아서 주입해주지만 동일 type이 두 개가 있으면 Qualifier로 지정해야 주입이 된다." 는 두 가지..
빌드를 알아보기로 한 가장 큰 계기가 되었던 Mapping에 대한 문제를 해결했다. 문제를 확인하기 전에 학원에서 과제로 했던 연습용 웹페이지와의 차이를 비교해보고자 한다. 사진상의 연습용 웹페이지는 mapping 설정 없이도 문제가 없이 잘 작동한다. 그리고 아래 localhost:8080은 이번에 graphQL을 적용하여 작업하려 하는 웹페이지다. 여전히 안돌아간다. 빌드에 대해 공부하고 있지만, 실질적인 사용법에 관한 공부는 아니었고 이론적인 OS에 관련된 부분이었기에결국, 나는 최후의 수단을 썼다. 커뮤니티 에디션과 30일 무료 체험판으로 받은 얼티밋 에디션을 동시에 켜고build.gradle 파일과 application.properties에 대해 비교하기로 한 것이다. 그중에서도 우선 build..
spring-boot 기반 graphQL을 적용한 web 프로그래밍 연습을 위해 프로젝트를 하나 생성했다. 학원에 있을 때는 이미 환경 설정이 끝난 프로젝트에서 코딩 연습을 했기에 처음으로 환경 세팅을 직접 해보기로 했다. 아직은 뭐가 뭔지 감도 못 잡는 나는 https://start.spring.io/에서 파일을 내려받아 열었고,잘 돌아가는지 확인해보기 위해 실행시켜 보았다. 일단 에러는 안 난다.그리고 크롬에서 접속해본 결과……. mapping이 안돼서 404 에러가 났다. 뭐가 문제인지조차 정확히 파악이 안 되는 상황이었기에코드 하나하나 어떠한 기능을 하는지 알아보기로 마음을 먹었고, 그렇게 오늘도 나의 친구 구글을 달달 볶아가며 찾아본 결과 혼돈에 빠졌다.[ah…. 헤어나올 수가 없어….] 왜냐하..
- Total
- Today
- Yesterday
- Spring
- mapping
- 한 입 크기로 잘라먹는 리액트
- header
- JAR
- 인텔리J
- 모듈
- spring-boot
- Java
- HTTP
- MySQL
- 스터디 회고
- web
- 일지
- 개발일지
- 프로그래머스
- RequestHandler
- springboot
- graphQL
- Gradle
- 회고
- Request Handler
- JavaScript
- @Autowired
- body
- 개발
- 자바스크립트
- 멀티모듈
- Spring Boot
- homebrew
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |