문제상황

  • 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.

 


[ 참고 자료 ]

 

코딩도 대신해주는 너란 녀석, 엄청나다.

 

 

요즘 노마트코더를 비롯한 개발자들의 유튜브 채널에 자주 등장하는 화제인 ChatGPT!

코드도 작성해주고, 만든 코드를 개선시켜 주기도하고, 다른 언어로 바꿔주는 등 인공지능으로 다양한 서비스를 제공한다고 한다. 

이번 프로젝트를 하면서, WebRTC와 관련된 예제코드들이 거의다 Node.js로 작성되어 있었는데, 도무지 이해할 수 없어서 이참에 한번 ChatGPT를 사용하여 Java로 언어변환을 시도해봤다! 비록 코드가 완전히 정확하진 않았지만, 그래도 뭔가 길을 안내해주는 (?) 역할은 한 것 같다.  완전 신기!

 

언어를 전공했는데 구글 번역기 등장으로 통번역가 일자리가 많이 줄더니, 코딩을 시작하자마자 바로 다음달에 ChatGPT가 등장한 My Life ..... ^__^  뭐 그래도 괜찮다. 오히려 좋아 ~ 잘 활용하면 인공지능을 통해 더 빨리 배울 수 있을 것 같다. 이거 만든 개발자들은 도대체 어떤 사람들일까 궁금하다. 파이썬을 공부해야 하나 ? ^___^ 허허

 

모든 개발자들 화잇팅 ! 


개념

  • ChatGPT는 사용자와 주고받는 대화에서 질문에 답하도록 설계된 언어모델이다. 오픈AI는 블로그 게시글을 통해 “챗GPT가 대화 형식으로 추가적인 질문에 답하고 실수를 인정하며 정확하지 않은 전제에 대해서는 이의를 제기하고 부적절한 요청을 거부할 수 있다”고 설명했다.

특징

  • 답변이 마음에 들지 않으면 Try Again 버튼으로 다른 답변을 요청할 수 있으며, 현재 답에 대해 긍정 또는 부정으로 평가할 수 있다.
  • 가능한 한 답변을 제공하려고 노력하나, 정치 색, 헤이트 스피치, 선정성등 사회통념상 논란이나 거부감이 들어간 답변은 거부하는 경우가 상당히 많다.
  • 기본적으로 간단한 개념에 대한 설명을 요청할 수 있으며, 특정 개념들에 대한 비교, 공통점, 차이점 등을 요청할 수도 있다.

잠재성 및 한계

  • ChatGPT가 가진 잠재력은 무시하지 못할 수준인데, 구글의 모회사인 알파벳 CEO가 직접 언급할 정도로 경계하고 있을 정도다. 데이터가 더 쌓여 한계를 극복한다면 사용자가 직접 검색할 대상의 정보를 입력해야 하는 현 검색 문법을 아예 뒤바꿀 기술이 될 것이기 때문에, 장기적으로는 구글을 비롯한 모든 검색 엔진을 대체 할 수 있는 기술이기 때문이다. 하지만 이러한 잠재적인 문제(영어)도 존재하기 때문에 섣부른 예측은 금물이다. 빅데이터 봇이라 그런지 영어로 질문하면 한국어로 질문할 때보다 정확도가 올라가긴 하지만, 100% 정확한 건 아니다.
  • 특히 기계학습 인공지능 모델들의 고질적 문제인 편향성 문제에서 자유롭지 못하다. 인공지능이 가치중립적일 것 처럼 보여도 결국 인공지능이 학습하는 것은 인간이 만든 데이터들이기 때문에 편향성에서 자유로울 수가 없다. 비교적 그런 문제에서 자유로운 편인 그림, 음악, 게임 알고리즘 부류와 달리 온갖 지식을 다루는 ChatGPT 특성상 편향성 문제가 강하게 드러날 잠재적 위험성이 크다. 게다가 제작진이 직접 개입하여 금지 사항을 정하고 가이드라인을 주입하기 때문에 더더욱 인위적인 편향성 문제가 생겨난다. 즉, 논란의 여지가 많은 질문일수록 대답을 신뢰하지 않는 것이 좋다.

 

출처 : https://namu.wiki/w/ChatGPT


 

ChatGPT 사이트 : https://openai.com/blog/chatgpt/

 

ChatGPT: Optimizing Language Models for Dialogue

We’ve trained a model called ChatGPT which interacts in a conversational way. The dialogue format makes it possible for ChatGPT to answer followup questions, admit its mistakes, challenge incorrect premises, and reject inappropriate requests. ChatGPT is

openai.com

위키피디아 설명 : https://en.wikipedia.org/wiki/ChatGPT

 

ChatGPT - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Artificial intelligence chatbot ChatGPT (Generative Pre-trained Transformer)[1] is a chatbot launched by OpenAI in November 2022. It is built on top of OpenAI's GPT-3 family of large l

en.wikipedia.org

 

'Coding > 기타' 카테고리의 다른 글

[ DataBase ] RDB, NOSQL, In-Memory  (0) 2023.01.22
WebServer vs Was  (0) 2023.01.13
HTTP 이해  (0) 2022.12.06
기술매니저님 추천 사이트 ( Spring 관련 )  (0) 2022.12.02
RESTful API 설계 가이드  (0) 2022.12.01

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로도 충분한 결과를 얻어낼 수 있다.

 

 


[ 참고자료 ]

문제

  • 프론트엔드의 요청으로 반환값으로 String 타입의 nickname 을 return 하는 상황
  • PostMan으로 테스트 한 결과, 한글과 띄어쓰기가 모두 ?로 반환되었다.

사진과 같이 띄어쓰기가 ?로 반환되고 있음을 볼 수 있다.

 

해결 

  • @RequestMapping의 produces 속성을 이용해 Response의 Content-Type을 제어할 수 있다

띄어쓰기가 ? 없이 잘 반환되는 것을 확인 할 수 있다.

 

 

문자열로 반환되어야 하는 부분이 갑자기 ??? 로 반환이 된다면 위와 같은 방법으로 해결해보자 ! 


[ 참고자료 ]

https://bigfat.tistory.com/103

 

[Spring] @RequestMapping의 produces 속성

@RequestMapping의 produces 속성을 이용해 Response의 Content-Type을 제어할 수 있다 한국관광공사가 제공하는 TourAPI를 사용하면서 지역코드(area_code)로 지역명(area_name)을 조회하는 간단한 요청에서 encoding

bigfat.tistory.com

 

+ Recent posts