목록프로젝트 (19)
barded
프로젝트를 진행하던 중, 위치 경로를 이어서 지도에 표현해야 했다. 세가지의 선택지가 있었다. 좌표를 각각 테이블로 저장하기 좌표를 한 컬럼에 배열로 저장하기 공간 데이터 타입에 저장하기 여기서 공간 데이터 타입에 대해 알아보고자 한다. 공간 데이터 타입 ( Spatial Data Type )이란? 쉽게 설명하면 X, Y 좌표로 구성된 공간 데이터를 저장하고 연산할 수 있는 기능을 제공해주는 데이터베이스. 다른 말로, 공간 데이터의 저장 형태를 구분하는 공간 데이터 타입과 공간 데이터를 연산할 수 있는 공간 함수가 제공되는 데이터베이스라고 표현 가능. 우리가 일반적으로 사용하고 있는 RDBMS인 Oracle, MariaDB, MySQL, PostgreSQL 등에서 공간 데이터를 처리하기 위한 기능을 제공..
EC2에 젠킨스를 Docker로 띄우면서, Docker 명령어가 적용되지 않는 경우가 있었고, 이를 통해 DooD(Docker Out Of Docker), DinD(Docker in Docker)에 대해 알게 되었다. DooD(Docker Out Of Docker)란? DooD는 Docker Out Of Docker의 약어로, 호스트 도커 데몬이 사용하는 소켓을 공유하여 도커 클라이언트 컨테이너에서 컨테이너를 실행시키는 것이다. 새로 실행시킨 컨테이너는 도커 클라이언트 컨테이너와 sibiling 관계를 가지며 테스트 환경이 도커 호스트 환경과 일치하는 것을 알 수 있다. 그리고 호스트와 도커 이미지를 공유한다. DinD(Docker In Docker)란? DinD는 Docker in Docker의 약어로..
이번 프로젝트에서 SpringBoot 3을 사용하면서 자바17을 필수로 사용하여야 했다. 이번 기회에 자바17를 정리해보고 가장 자주 사용한 record에 대해 알아보자 여기어때 블로그를 참조해보면, 크게 3가지의 이유로써 자바 17을 사용했다고 한다. 1. Java Support 기간이 길다. 현재까지 발표로는 8버전의 지원 기간이 17버전보다 상대적으로 조금 더 긴 게 사실입니다. 그러나, 17버전의 지원 기간이 절대적으로 짧다고 할 수는 없습니다. 또한, 해당 기간 만료 전 또 다른 LTS버전 공개를 준비하고 있지 않을까 생각하고 있습니다. 2. 신규 버전을 위한 대비 현재 사용 중인 버전의 지원 종료일이 도래하여 다른 LTS 버전(JDK 21)을 찾아야 할 시점에, 8버전에서 바로 최신 버전으로 ..

유저의 회원가입을 진행하는 경우 SMTP를 사용하여 이메일 인증을 받도록 처리하였고 이를 EmailService라고 명명하여 서비스로 빼놓았다. @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class EmailService { private final JavaMailSender javaMailSender; private final JwtProvider jwtProvider; public MimeMessage createAuthorizationEmail(String to, String token) { MimeMessage message = javaMailSender.createMimeMessage(); try { mess..

Spring Security의 Security Context에 고객의 정보를 넣고 인증 시 이를 사용하는 방식을 사용했다. loadUserByUsername 메서드를 통해 DB에서 User를 조회해 온 뒤 UserDetails을 implements한 UserAdapter에 user 객체를 넣어주기 때문에 영속성 컨텍스트에 당연히 user객체가 있을줄 알았다. 하지만 OSIV가 OFF인 상태이다. 그래서 User 객체의 영속성 컨텍스트 생존 범위가 Service단에서만 살아있다. OSIV (Open Session In View)란? OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어두는 기능이다. JPA에서는 OEIV(Open EntityManager In View), Hibe..
현재 고객의 클래스는 다음과 같다. public abstract class User { @Id @GeneratedValue @Column(name = "user_id") private Long id; private String name; private String email; private String password; private String phoneNumber; private String nickname; //기본 유저 생성시 GUEST로 초기화 @Builder.Default @Enumerated(EnumType.STRING) private Role role = Role.GUEST; @CreatedDate @Column(updatable = false, nullable = false) privat..

현재 GlobalExceptionHandler를 통해 컨트롤러단에서 발생하는 에러는 전역적으로 처리가 되어있다. @Slf4j @RestControllerAdvice @RequiredArgsConstructor public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage())); } @Excep..
로그인한 사용자의 정보를 파라미터로 가져오고 싶을때 `Java`의 표준 `Principal` 객체를 받아와 사용할 수 있지만 `Principal` 객체는 `name` 정보만 참조할 수 있다. 이때 `@AuthenticationPrincipal` 애노테이션을 사용하면 `UserDetailService`에서 return하는 객체를 파라미터로 직접 받아 사용할 수 잇다. //ava 표준 Principal 객체를 받아서 사용 @GetMapping("/") public String index(Model model, Principal principal) { if (principal == null) { model.addAttribute("message", "Spring security"); } else { model..

어디가게 프로젝트는 사용자를 크게 두가지로 구분할 수 있다. 고객(Customer) 사장(Owner) 이럴 경우에 테이블 설계 혹은 엔티티 클래스는 어떻게 작성해야 할까? 라는 고민을 조금 했었다. 이를 해결하기 위해 찾은 몇가지 방법과 채택한 방법을 소개하도록 하겠다. 먼저 객체와 데이터베이스의 차이점을 알아야 한다. 객체는 상속을 지원하므로 모델링과 구현이 똑같지만, 데이터베이스는 상속을 지원하지 않으므로, 논리 모델을 물리 모델로 구현할 방법이 필요하다. 이러한 방법은 슈퍼-서브타입 도출을 통해 특징을 구별해내고 이를 통해 관계를 변환시키면 된다. 슈퍼-서브타입의 도출 예시 (슈퍼, 서브타입 엔터티 식별자의 도메인은 반드시 같아야한다.) 공통된 데이터만 사원 엔터티에 남기고(슈퍼타입) 기술직, 관리..