문제상황

  • WebRTC를 이용해 프론트엔드와 화상채팅을 구현하는 코드를 작성 중이다.
  • 채팅방에 들어오는 사람마다 session ID를 갖고있는데, 이 세션 아이디를 Redis DB에 저장하는 과정에서 아래와 같은 두 가지 에러가 발생했다.
  • Jackson ObjectMapper를 사용해서 객체타입인 세션을 스트링타입으로 변환해주고 다시 객체타입으로 변환하는 그런 로직에 사용했는데, 이 부분에서 에러가 터진 것 같다. (추측)

1. No serializer found for class org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

 

2. Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

 

원인 : 모름

해결 : 못함

 

 

[ 참고자료 ]

https://interconnection.tistory.com/137

 

Jackson ObjectMapper 정리

개요 Java 개발자라면 Jackson에서 제공하는 ObjectMapper와 자주 마주치게 됩니다. Java 클래스 내용을 확인하거나 내용물의 Parsing 과정에 필요한 커스터마이징이 존재하기 때문입니다. 물론 중요한 기

interconnection.tistory.com

https://jinseongsoft.tistory.com/248

 

[SpringBoot] Jackson 사용시 Could not write JSON: No serializer found for class.. 오류 발생 해결법

들어가며 Class를 Serialize 하는 과정에서 아래와 같은 에러가 발생하였다. Exception in thread "Thread-5" org.springframework.messaging.converter.MessageConversionException: Could not write JSON: No serializer found for class com.tact.

jinseongsoft.tistory.com

 

 

이번 프로젝트에 WebSocket/Stomp 를 이용해 채팅기능을 구현하면서 프론트에 전달하는 messageType에 Enum을 사용하게 되었다. 내가 구현한 코드부분이 아니기도하고 Enum에 대한 개념이해가 부족해서 정리해보려 한다.


Enum 이란?

  • Enum이란 enumerated type의 줄임말로 열거형이라고 불리며 서로 연관된 상수들의 집합을 의미한다.
  • 흔히 상수를 정의할 때 final static string 과 같은 방식으로 상수를 정의한다. 하지만 이렇게 상수를 정의해서 코딩하는 경우 다양한 문제가 발생하는데, 이러한 문제점들을 보완하기 위해 자바 1.5버전부터 새롭게 추가된 것이 바로 "Enum" 이다.
  • 기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 Enum을 이용해서 같은 효과를 낼 수 있다.

 

Enum의 장점

  • IDE의 지원을 받을 수 있다. 자동완성, 오타검증, 텍스트 리팩토리 등
  • 허용 가능한 값들을 제한할 수 있다.
  • 리팩토링 시 변경 범위가 최소화 된다. 내용을 추가해도 Enum 코드만 수정하면 된다.
  • 확실한 부분과 불확실한 부분을 분리할 수 있다.
  • 문맥(Context)을 담을 수 있다.
  • 코드가 단순해지며, 가독성이 좋다.
  • 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다.
  • enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크한다.
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있다.

 

Enum 사용시 주의점

  • Enum을 사용하는데 있어 가장 큰 허들은 "변경이 어렵다"란 점
  • 코드를 추가하거나 변경해야 하는 일이 빈번하다면, 매번 Enum 코드를 변경하고 배포하는것보다 관리자 페이지에서 관리자가 직접 변경하는 것이 훨씬 편리할 수 있다.
  • 위와 같은 경우 테이블로 관리함으로써 얻는 장점이 정적언어를 활용함으로써 얻는 장점을 버릴정도로 더 큰지 고민해봐야 한다.

[ 참고자료 ]

 

https://eatnows.tistory.com/91

 

Enum이란?

Enum이란? enum이란 enumerated type의 줄임말로 열거형이라고 부르기도 하는데 컴퓨터 프로그래밍에서 열거형(enumerated type, enumeration)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다.

eatnows.tistory.com

https://limkydev.tistory.com/50

 

[Java] enum 이란?

Enum class란? 우리가 흔히 상수를 정의할 때 final static string 과 같은 방식으로 상수를 정의를합니다. 하지만 이렇게 상수를 정의해서 코딩하는 경우 다양한 문제가 발생됩니다. 따라서 이러한 문제

limkydev.tistory.com

https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com

 

문제상황

  • PostMan으로 게임방 생성하는 API를 테스트하는데 다음과 같은 에러가 발생했다.
  • 회원탈퇴 기능을 추가한 후, 회원이 탈퇴하더라도 피드백 게시판의 글은 그대로 보존하기 위해, 아래와 같이 CascadeType.PERSIST 를 OneToOne으로 Member와 연관관계가 있는 곳마다 달아주었더니 다음과 같은 에러가 발생했다.

 

GameRoomAttendee 엔티티 부분

 

PostMan error
인텔리제이 콘솔창 에러

 

 

원인 

  • 엔티티간 종속성 관계로 발생한 문제이다.
  • GameRoomAttendee가 이미 Member(PK)값을 가지고 있기 때문에 중복 저장이 발생되어 발생한 에러이다.

 

해결방법

  • 영속성 전이인 cascade 옵션을 제거해주었다.

 

제대로 방생성 기능이 수행됨 !

 

 

CascadeType의 종류

  • CascadeType.RESIST: 엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 등록된 키값을 가지고 있다면 detached entity passed to persist Exception이 발생한다.
  • CascadeType.MERGE: 트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 되면 변경사항이 적용된다.(연관 엔티티의 추가 및 수정 모두 반영됨)
  • CascadeType.REMOVE: 삭제 시 연관된 엔티티도 같이 삭제됨
  • CascadeType.DETACH: 부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.
  • CascadeType.ALL: 모든 Cascade 적용

[ 참고자료 ]

https://allonsyit.tistory.com/108

 

[JPA] 연관관계 영속성 전이 CASCADE

# CASCADE - 부모 엔티티에서 자식 엔티티로 상태를 전이하는 것 ex. 부모 엔티티 저장할 때 자식 엔티티도 함께 저장, 게시글과 첨부파일 - Parent와 Child가 라이프사이클이 동일할 때, Child를 소유하

allonsyit.tistory.com

 

Git vs GitHub

Git

  • Git is a distributed version control system for tracking changes in source code during software development.
  • It is designed for coordinating work among programmers, but it can be used to track changes in any set of files.
  • Its goals include speed, data integrity, and support for distributed, non-linear workflows.
  • Git은 소프트웨어 개발 중에 소스 코드의 변경 사항을 추적하기 위한 분산 버전 제어 시스템입니다. 
  • 프로그래머 간의 작업 조정을 위해 설계되었지만 모든 파일의 변경 사항을 추적하는 데 사용할 수 있습니다.
  • 그 목표에는 속도, 데이터 무결성 및 분산된 비선형 워크플로우에 대한 지원이 포함됩니다.

GitHub

  • GitHub is a web-based Git repository hosting service, which offers all of the distributed revision control and source code management (SCM) functionality of Git as well as adding its own features. 
  • GitHub는 웹 기반 Git 리포지토리 호스팅 서비스로, 자체 기능을 추가할 뿐만 아니라 Git의 모든 분산 개정 제어 및 소스 코드 관리(SCM) 기능을 제공합니다. 
Git GitHub
소프트웨어이다. 서비스이다.
시스템에 로컬로 설치된다. 웹에서 호스팅된다.
Linux에서 관리한다. Microsoft에서 관리한다.
소스 코드 히스토리를 관리하기 위한 버전관리 시스템 Git 리포지토리를 위한 호스팅 서비스
사용자 관리 기능이 없다. 사용자 관리 기능이 내장되어 있음

 

Git-flow vs Github-flow

Git-flow

  • Git-flow는 브랜치를 크게 4가지로 나누어 개발하는 전략입니다.
    • 메인 브랜치(Main branch)
    • 피처 브랜치(Feature branch) 또는 토픽 브랜치(Topic branch)
    • 릴리스 브랜치(Release branch)
    • 핫픽스 브랜치(Hotfix branch)
  • 가장 중심이 되는 브랜치는 masterdevelop 브랜치이며,  merge된 feature, release, hotfix 브랜치는 삭제하도록합니다.
  • Git-flow 전략은 주기적으로 배포를 해야하는 프로젝트에는 적합하지만, 브랜치가 많아 복잡하고 어떤 프로젝트에 따라서는 몇몇 브랜치가 애매한 포지션을 가질 수 있습니다.
  • Git Flow is usually more complicated than GitHub flow. It is used when your software has the concept of “release”. This flow works perfectly when you work in a team of one or more developers and they collaborate on the same feature.

 

Github-flow

 

  • Git-flow가 Github에서 사용하기에는 복잡하다고 나온 브랜칭 전략입니다.
  • 흐름이 단순한 만큼 role도 단순합니다. master 브랜치에 대한 role만 정확하다면 나머지 브랜치들에 대해서는 관여하지 않습니다.
  • 즉, hotfix 브랜치나 feature 브랜치를 구분하지 않습니다. 다만 우선순위가 다를 뿐입니다. pull request 기능을 사용하도록 권장합니다.
  • 이 브랜칭 전략은 수시로 배포가 일어나며, CI와 배포가 자동화되어있는 프로젝트에 유용합니다.
  • GitHub flow is really very simple to adapt as this flow doesn’t have releases because your deployment to production happens every day. There are two types of branches involved in this flow, the master branch, and the feature branch.

 


[ 참고 자료 ]

 

Spring 이란 ? 

  • 스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 불린다.
  • 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 
  • Spring is an open-source lightweight framework that allows Java EE 7 developers to build simple, reliable, and scalable enterprise applications.
  •  It made the development of Web applications much easier than compared to classic Java frameworks and Application Programming Interfaces (APIs), such as Java database connectivity (JDBC), JavaServer Pages(JSP), and Java Servlet.
  • The Spring framework can be considered as a collection of sub-frameworks, also called layers, such as Spring AOP. Spring Object-Relational Mapping (Spring ORM). Spring Web Flow, and Spring Web MVC.

특징

  • 경량 컨테이너
  • IoC(Invertion of Control: 제어 역행) :  IoC는 컨트롤의 제어권이 개발자에게 있는 것이 아닌 프레임워크가 대신해서 해주는 것을 말합니다. Servlet이나 Bean 같은 코드를 개발자가 직접 작성하지 않고, 프레임워크가 대신 수행합니다. 제어의 역전이라는 말이 어려울 수 있는데, 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미입니다.
  • Di(Dependency Injection: 의존성 주입) : DI란 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하는 것입니다. 객체 간 결합이 느슨하면 코드의 재사용성이 증가하고, 단위 테스트가 용이해집니다.
  • AOP(Aspect-Oriented Programming: 관점지향 프로그래밍) : AOP는 핵심기능을 제외한 부수적인 기능을 프레임워크가 제공하는 특징입니다. 예를 들어 Spring 프로젝트에 security를 적용하거나, logging 등을 추가하고 싶을 때 기존 비즈니스 로직을 건들지 않고 AOP로 추가할 수 있습니다.
  • 중복 코드 제거 : JDBC 같은 템플릿을 사용할 때 중복되는 코드도 많고 복잡합니다. 이를 모두 제거합니다.

 

Spring Boot 란?

  • 스프링 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 정말 편하게 스프링을 활용할 수 있도록 돕는다. 실행환경이나 의존성 관리 등의 인프라 관련 등은 신경쓸 필요 없이 바로 코딩을 시작하면 된다. 
  • Spring Boot는 기본적으로 Spring Framework를 설정하는데 필요한 구성을 제거하는 Spring Framework의 확장버전이다.
  • 개발자 입장에서 더 빠르고 효율적으로 프로그램 개발이 가능하도록 도와준다.
  • Spring Boot is built on top of the conventional spring framework.
  • So, it provides all the features of spring and is yet easier to use than spring.
  • Spring Boot is a microservice-based framework and making a production-ready application in very less time.
  • In Spring Boot everything is auto-configured. We just need to use proper configuration for utilizing a particular functionality. Spring Boot is very useful if we want to develop REST API. 

특징

  • Embed Tomcat을 사용하기 때문에, (Spring Boot 내부에 Tomcat이 포함되어있다.) 따로 Tomcat을 설치하거나 매번 버전을 관리해 주어야 하는 수고로움을 덜어준다.
  • starter을 통한 dependency 자동화
    과거 Spring framework에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고, 때문에 하나의 버전을 올리고자 하면 다른 dependeny에 까지 영향을 미쳐 version관리에 어려움이 많았다. 하지만, 이제 starter가 대부분의 dependency를 관리해주기 때문에 이러한 걱정을 많이 덜게 되었다.
더보기
  • spring-boot에서 starter란 의존성과 설정을 자동화해주는 모듈을 뜻한다.

    예를 들어, spring-boot-starter-jpa를 의존성 추가했을 때 아래의 일을 해준다.

    - spring-aop, spring-jdbc 등의 의존성을 걸어준다.
    - classpath를 뒤져서 어떤 Database를 사용하는지 파악하고, 자동으로 entityManager를 구성해준다.
    - 해당 모듈들 설정에 필요한 properties 설정을 제공한다(Configuration Processor를 사용하면 효과 UP)
    - 프로젝트를 진행하면서, 공통적으로 사용되는 spring 설정을 모듈로 묶어놓고 사용할 수 있다.
    - 또한 필요한 경우, 상위 프로젝트에서 얼마든지 설정을 덮어쓸 수 있다.
  • XML설정을 하지 않아도 된다.
  •  jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다.
  • Spring Actuaor를 이용한 애플리케이션의 모니터링과 관리를 제공한다.

 

Difference between Spring and Spring Boot

  • Spring Framework는 기존에 EJB를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있게 해 주고, Spring Boot Framework는 Spring Framework보다 개발자가 더더욱 개발에만 집중할 수 있도록 도와주는 프레임워크이다.
  • 프로젝트에서 필수적인 종속성 구성이 필요하다면 Spring을, 일반적인 종속성 구성으로 구현이 가능한 프로젝트라면 Spring Boot로도 충분한 결과를 얻어낼 수 있다.

 

 


[ 참고자료 ]

+ Recent posts