본문 바로가기
관리자

Programming-[Backend]

(393)
[TIL] PO(Parameter ObjecT)와 DTO(Data Transfer Object)는 구분해서 쓰자 만약 PO가 아래와 같이 구성되어 있는 상황이라면, 즉 어떤 PO 내부에 또 다른 PO(...CreateContactsPo)가 있는 상황이라면 각각의 PO에 해당하는 DTO를 1:1로 매칭하듯이 구성하여야 한다. 이렇게 해서 Mapper를 이용하여 정확히 PO를 DTO로 치환해주고, 각 개체를 구분시켜줄 수 있기 때문이다. 가장 중요한 이유는 DTO는 component에 포함되어 있고 PO는 controller에 포함된 구조이기 때문이다. 각 패키지에 있는 파일들이 독립적으로 유지되어 있어야 추후에 분리될 상황이 오더라도 문제없기 때문이다. 이것도 객체지향적 방식이라 할 수 있을까...?
[에러] Cannot deserialize instance of, Leading zeroes not allowed, Swagger 스웨거 날짜, 리스트 입력 현상 1. Cannot deserialize instance of... 2. Leading zeroes not allowed... 원인 1. (Swagger에서) 파라미터 값을 잘못 입력하여 Java 가 해당 값들을 제대로 파싱하지 못하는 경우 2. (Swagger에서) 파라미터 값으로 날짜를 입력할 때, 0을 앞에 붙인 경우. 예를 들어 2020-08-23으로 입력 (2020-8-23으로 입력해야함) 해결 선제조건 기본적으로 파라미터의 @Schema 정의 시에, example 부분을 안적으면 Swagger의 입력화면에서 자동으로 입력 양식을 잡아준다. 컨트롤러에서 파라미터 부분에 @RequestBody 어노테이션을 붙여준 경우이다. 파라미터로 날짜를 정의할 때, @DateTimeFormat으로 날짜 형..
[에러] THE INSERT statement conflicted with the FOREIGN KEY constraint... 현상 save 처리 시에, THE INSERT statement conflicted with the FOREIGN KEY constraint 라는 문구와 함께 에러 발생 원인 Foregin key(FK)로 넣을려는 데이터의 id가 실제 테이블에 없을 때 발생한다. 예를 들어 아래와 같이 Members 엔티티가 Emails 엔티티를 @ManyToOne으로 FK로 연결된 상황이라면, Members 엔티티를 저장할 때 Emails 엔티티의 id 값이 Emails 테이블에 존재하여야 한다. Emails 테이블에 id값이 id = 2인 부분이 없는데, Member 엔티티 저장 시 Emails 엔티티의 id값을 2로 지정하면 에러가 발생하는 것이다. 해결 존재하는 id값만 넣어준다. 다른 해결책은 아직 모르겠음..
[에러] SQLServerException : Cannot insert the value NULL into column ... column does not allow nulls. INSERT fails 현상 빌더 패턴 방식을 이용하여 Entity를 만들고, XxxRepository.save(XxxEntity)로 DB에 Entity 값을 저장하려는데, 아래와 같이 Cannot insert... 에러가 발생했다. 에러 화면 빌더 패턴으로 Entity 만들기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 XxxEntity xxxEntity = XxxEntity.builder() .Column1(Column1에 들어갈 값) .Column2(Column2에 들어갈 값) .Column3(Column3에 들어갈 값) .Column4(Column4에 들어갈 값) .Column5(Column5에 들어갈 값) //원인 : 요 사이 값들은 필수값 인데도 안넣어줌 .Column10(Colu..
트랜잭션이란 2. 트랜잭션의 성질 1. 트랜잭션의 범위는 커넥션을 기준으로 한다. 트랜잭션은 클라이언트(app)과 DB간의 연결을 의미하는 커넥션을 기준으로 정의된다. 만약 아래의 그림과 같이 각 커넥션 1, 2를 따라 트랜잭션이 발생하는 과정을 생각해보자. 트랜잭션1 내부의 method에 의해서 커넥션2, 트랜잭션2가 실행되고 commit된 상황이라면 마지막에 트랜잭션1을 롤백하더라도 트랜잭션2의 commit 사항은 롤백되지 않는다. 이것은 트랜잭션의 범위가 커넥션을 기준으로 하기 때문이다. 트랜잭션 전파 : 스프링 자바에서의 Transactional 스프링 자바 코드에서 하나의 메서드 내부에서 다른 메서드를 호출하여 사용한다면, 프레임워크에서 지원하는 @Transactional 어노테이션을 이용하여 트랜잭션을 전파할 수 있다. 즉, ..
트랜잭션이란 1. 기본 개념 1. 개념 트랜잭션은 데이터베이스(Database, DB)에서 일어나는 작업의 최소 단위를 말한다. 만약 A가 B에게 10,000원을 이체한다면 DB에 있는 A의 계좌정보에서 10,000원을 빼줘야 하고, B의 계좌정보에는 10,000원을 더해주어야 한다. 이 과정을 차례대로 나누어 생각해보자. 1. A의 계좌 잔액을 확인한다. 2. A의 계좌에서 10,000원을 제한다. 3. B의 계좌 잔액을 확인한다. 4. B의 계좌에 10,000원을 더한다. 위 과정 중에 네트워크 또는 프로그램상의 문제가 발생하면, 예를 들어 2까지만 진행되고 3에서 에러가 나버린채로 DB에 정보가 반영된다면 문제가될 것이다. 따라서 4가지 과정을 한 가지의 최소 단위의 작업으로 묶어서 처리할 필요가 있는데, 이것이 트랜잭션의 개..
[TIL] DB save 테스트 Id값 증가, Auto Increment 값은 transaction에 포함되지 않음 현상 @DataJpaTest를 이용하여 Save 테스트를 하면, 자동으로 Rollback이 되므로 DB 상에 데이터가 들어가지 않는다. 하지만, 여러 번 테스트 후에 Rollback을 하지 않고 실제 데이터를 넣어 보면, 아래와 같이 id값이 증가되는 것을 볼 수 있다. 원인 이것은 Auto increment가 적용되는 id 값은 rollback 되지 않기 때문이다. 정확하게는 Auto increment 값은 transaction에 포함되지 않기 때문에 내부적으로 id값이 증가하므로 실제 save 시에 증가된 id값이 적용되는 것이다. 해결 이런 경우 id 값을 ALTER TABLE {테이블명} auto_increment = {원하는 id값} 을 입력하여 변경해줄 수 있다.(참조1) 추가 Rollback..
[TIL] Swagger 날짜 입력 : @DateTimeFormat- Controller의 파라미터 중 LocalDate 처리 Swagger에 날짜 입력을 하려고 하니, 타입 에러가 발생했다. 이럴 때는 Controller의 파라미터 오브젝트를 표기해주는 부분에 @DateTimeFormat을 붙여주어 날짜 타입의 포맷을 명시해주어야 한다. Controller에 데이터를 전달해주는 파라미터 오브젝트(PO) 파일 중 한 개의 필드 pattern 옵션으로 원하는 양식대로 포맷을 설정해주면, 아래와 같이 Swagger에서 정상적으로 날짜 타입을 입력할 수 있다. Swagger 화면 입력 만약 RequestBody로 처리해야되는 상황이면 @JsonFormat을 사용해야 한다. 자세한건 아래 링크. [TIL] @JsonFormat으로 @DateTimeFormat 대신 Date까지만 받기