묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
isLoaded, gerReference
emf.PersistenceUnitUtil.isLoaded()로 프록시 인스턴스가 초기화 되었는지를 확인할 때 Member member1 = new Member(); member1.setUsername("user1"); em.persist(member1); em.flush(); em.clear(); Member refMember = em.getReference(Member.class, member1.getId()); System.out.println("refMember.getClass() = " + refMember.getClass()); // refMember.getUsername(); // 프록시에 없는값을 조회하여 프록시를 초기화 // Hibernate.initialize(refMember); // refMember를 강제로 초기화 System.out.println("isLoaded(refMember) = " + emf.getPersistenceUnitUtil().isLoaded(refMember)); tx.commit();이런 상황이면 false가 나오는 이유에 대해 메커니즘을 제대로 이해했는지 모르겠어서 문의드립니다!저는 getReference만으로도 객체를 생성했으니까 초기화가 이루어졌구나라고 이해했는데,처음 getReference로 조회하면 프록시 객체가 생성될 때 원래의 Entity를 상속받아서 생성되는게 아니라,아규먼트 값의 getId값만으로 프록시가 생성되었기 때문에 초기화는 아직 안한 상태여서 그런것일까요?그럼 초기화를 해야서 프록시의 target에 실제 객체를 연결해야지만 실제 엔터티를 상속받은 프록시 객체라고 이해해야할지 명확하게 이해가 안되어서 문의드립니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
given - when - then 구조에 대해 질문 있습니다.
@Test void remove() { CafeKiosk cafeKiosk = new CafeKiosk(); Americano americano = new Americano(); cafeKiosk.add(americano); assertThat(cafeKiosk.getBeverages()).hasSize(1); cafeKiosk.remove(americano); assertThat(cafeKiosk.getBeverages()).isEmpty(); }저는 given은 CafeKiosk cafeKiosk = new CafeKiosk(); 이런식으로 객체를 생성하는 단계when은 cafeKiosk.add(americano); 와 같이 실제 메서드를 사용하는 단계then은 assertThat(cafeKiosk.getBeverages()).isEmpty(); 와 같이 실제값과 기대값을 검증하는 단계라고 이해를 했습니다. 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다.먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다.하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Order import 문제
<orderServiceTest> <OrderService>Order의 import를 domain에 있는 Order class로 했는데 왜 위와 같은 오류가 나는지 모르겠습니다.
-
미해결실전! Querydsl
pageable size 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Pageable의 size의 최댓값을 제한하거나 개발자가 정한 임의의 값으로 고정하는 방법이 있을까요?다른 질문글에 있는 링크는 글이 삭제된 건지 제대로 나오지 않습니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
6장 상품 등록을 이미지 없이 등록 후 getList 할 때 질문
안녕하세요 6장 상품 등록을 이미지 없이 등록을 해봤는데요 예를 들어 상품번호가 17번이면product_image_list 테이블에 17번(product_pno)이등록되지 않아서 left join이 걸리지 않아 리스트를 호출시 해당 번호의 상품만 호출이 안되더라구요이럴 경우에는 어떠한 방법으로 해결할 수 있을지 궁금하여 질문드립니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
AWS EC2 Launch Template 생성 문의 - 빈즈토크 배포 이슈
안녕하세요. 한가지 문의 드립니다.부록_AWS 빈즈톡, RDS, S3 자료.pdf 를 보고 있습니다.7 (/ 45) 페이지에서 보면 정상적으로 환경 구성이 완료되면 configurations 결과 화면이 잘 출력됩니다.헌데 일부 계정 아마도 최근에 생성한 aws 계정은 이게 정상적으로 진행이 안되고 아래와 같은 메시지가 나옵니다.Creating Auto Scaling launch configuration failed Reason: Resource handler returned message: "The Launch Configuration creation operation is not available in your account. Use launch templates to create configuration templates for your Auto Scaling groups. (Service: AutoScaling, Status Code: 400, Request ID: 850290f7-96b3-4229-81dc-966dbee4d735)" (RequestToken: 44311bf6-616a-3270-9235-5c2d1993a1b7, HandlerErrorCode: GeneralServiceException) AWS EC2 Launch Template을 반드시 생성해야 7 (/ 45) 페이지에서 보이는 환경 구성이 정상적으로 완료가 되고 그 결과 configurations 화면이 잘 출력되는 것으로 최근 변경 된 것 같습니다.문제는 이 AWS EC2 Launch Template 생성에 대한 부분에서 벽에 막힌 상태입니다.어떻게 하면 좋은지 요청 드려 봅니다.감사합니다.
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
application.yml token 선언 시 오류
token: secret: and0LXRva2VuLXNlY3JldA== # 임의의 문자열 access-token-expiration-time: 900000 # 15분 1000(ms) x 60(s) x 15(m) refresh-expiration-hours: 1209600000 # 2주 1000(ms) x 60 (s) x 60(m) x 24(h) x 14(d) 구성 프로퍼티 'token. access-token-expiration-time'을(를) 해결할 수 없습니다구성 프로퍼티 'jwt. refresh-token-expiration-time'을(를) 해결할 수 없습니다. 위 코드말고 다른 코드로 대체해야 하는지 궁금합니다.
-
해결됨Spring Boot를 활용하여 채팅 플랫폼 만들어보기
Package 구성
domain안에 따로 repository를 만든 이유가 있나요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
BaseEntity의 4가지 필드값 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. BaseEntity에서 가지고 있는 속성이createdBy, createdDate, lastModifiedBy, LastModifiedDate 4가지로 시스템 컬럼이라고 생각했습니다. Item에서 SINGLE_TABLE로 사용하는 것이 아닌 JOINED로 사용하는 경우 Item을 상속받은 Album, Movie, Book은 저 4가지 컬럼을 추가할 수 있도록 해줘야 되는 것이 아닌가요?모든 테이블에는 시스템 컬럼이 존재해야된다고 알고 있는 데 이 부분은 DBA가 테이블을 관리하는 목적으로 사용되는 값들이므로 createdBy, createdDate, lastModifiedBy, LastModifiedDate 이 4가지와는 별개의 내용인건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 엔티티를 ResponseDTO에 담을 때 오류에 대해 질문있습니다.
안녕하세요 영한님. 다대다 연관관계를 공부하고 제 프로젝트에적용하려다가 오류가 발생해서 질문드립니다. Product와 Tag를 다대다로 관계시키기 위해 ProductTag테이블을 만들었습니다.ResponseProduct에 Product를 넣어서 응답으로 보내려 하는데 이렇게 하니 Product->ProductTag->Tag->ProductTag 이 과정이 무한반복이 일어나고 있습니다.이것을 어떻게 해결하면 좋을까요? 항상 영상 잘 보고 있습니다. 화이팅 하세요!! public class ResponseProduct { private Product product; private Long categoryId; }@Entity public class Product { @OneToMany(mappedBy = "product", orphanRemoval = true) private List<ProductTag> productTags = new ArrayList<>(); }@Entity public class ProductTag { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "tag_id") private Tag tag; }@Entity public class Tag { @OneToMany(mappedBy = "tag", orphanRemoval = true) private List<ProductTag> productTags = new ArrayList<>(); }
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
리액트 코드 스플리팅
맨 처음 리액트 코드스플리팅 에서 막히는데요,,,ㅠㅠ강의 내용이랑 똑같이 했는데 막히는데 한번봐주실수있으실까요??그리고 코드를 작성하고 리액트화면을 그냥 새로고침하면 코드가적용이되는게 맞죠? 제가하면 지금 mainPage div만 나오고 나머지는 나오지않아서요 import { Suspense, lazy } from "react"; import { createBrowserRouter } from "react-router-dom"; // require 대신 import로 수정 const Loading = <div>Loading...</div>; const Main = lazy(() => import("../pages/mainPage")); // lazy 게으르다 -> 코드 스플리팅 const About = lazy(() => import("../pages/about")); // lazy 게으르다 -> 코드 스플리팅 const root = createBrowserRouter([ { path: '', element: <Suspense fallback={Loading}><Main /></Suspense> }, { path: 'about', element: <Suspense fallback={Loading}><About /></Suspense> } ]); export default root; import React from 'react' import { Link } from 'react-router-dom' const mainPage = () => { return ( <div className = 'text-3xl'> <div className={'flex'}> <Link to ={'/about'}>About</Link> </div> <div>mainPage</div> </div> ) } export default mainPage import React from 'react' import { Link } from 'react-router-dom' const about = () => { return ( <div className={'text-3xl'}> <div className={'flex'}> <Link to ={'/about'}>About</Link> </div> <div>About page</div> </div> ) } export default about import React from 'react' import { RouterProvider } from 'react-router-dom' import root from './router/root' const App = () => { return ( <RouterProvider router={root} /> ) } export default App
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
ExperienceRepositoryTest 실행 오류
++++테스트파일에서 오타가 난 줄 알았는데 레포지토리 파일 모두 오타가 나있었네요!!감사합니다!
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
projectRepository assertion 오류 질문입니다.
projectRepositoryTest.kt 파일을 아래와 같이 작성했는데 assertion 오류가 나서 원인을 모르겠어서 해당 파일 코드 첨부합니다. 94줄과 111줄 오류인 걸로 보아 skills를 assert할 때 뭐가 잘못된 것 같은데 어떻게 고쳐야 하는지 잘 모르겠습니다..!package com.yewon.portfolio.domain.repository import com.yewon.portfolio.domain.constant.SkillType import com.yewon.portfolio.domain.entity.Project import com.yewon.portfolio.domain.entity.ProjectDetail import com.yewon.portfolio.domain.entity.ProjectSkill import com.yewon.portfolio.domain.entity.Skill import org.assertj.core.api.Assertions import org.assertj.core.api.Assertions.* //import com.yewon.portfolio.domain.entity.* //import org.assertj.core.api.Assertions.* import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest @DataJpaTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) class ProjectRepositoryTest( @Autowired val projectRepository: ProjectRepository, @Autowired val skillRepository: SkillRepository ) { val DATA_SIZE = 10 private fun createProject(n: Int): Project { val project = Project( name = "${n}", description = "테스트 설명 {n}", startYear = 2023, startMonth = 9, endYear = 2023, endMonth = 9, isActive = true ) val details = mutableListOf<ProjectDetail>() for (i in 1..n) { val projectDetail = ProjectDetail(content = "테스트 ${i}", url = null, isActive = true) details.add(projectDetail) } project.addDetails(details) val skills = skillRepository.findAll() val skillsUsedInProject = skills.subList(0, n) for (skill in skillsUsedInProject) { val projectSkill = ProjectSkill(project = project, skill = skill) project.skills.add(projectSkill) } return project } @BeforeAll fun beforeAll() { println("----- 스킬 데이터 초기화 시작 -----") val skills = mutableListOf<Skill>() for (i in 1..DATA_SIZE) { val skillTypes = SkillType.values() val skill = Skill(name = "테스트 ${i}", type = skillTypes[i%skillTypes.size].name, isActive = true) skills.add(skill) } skillRepository.saveAll(skills) println("----- 스킬 데이터 초기화 종료 -----") // println("----- 데이터 초기화 이전 조회 시작 -----") // val beforeInsert = projectRepository.findAll() // assertThat(beforeInsert).hasSize(0) // println("----- 데이터 초기화 이전 조회 종료 -----") println("----- 테스트 데이터 초기화 시작 -----") val projects = mutableListOf<Project>() for (i in 1..DATA_SIZE) { val project = createProject(i) projects.add(project) } projectRepository.saveAll(projects) println("----- 테스트 데이터 초기화 종료 -----") } @Test fun testFindAll() { println("----- findAll 테스트 시작 -----") val projects = projectRepository.findAll() assertThat(projects).hasSize(DATA_SIZE) println("projects.size: ${projects.size}") for (project in projects) { assertThat(project.details).hasSize(project.name.toInt()) println("project.details.size: ${project.details.size}") assertThat(project.skills).hasSize(project.name.toInt()) println("project.skills.size: ${project.skills.size}") } println("----- findAll 테스트 종료 -----") } @Test fun testFindAllByIsActive() { println("----- findAllByIsActive 테스트 시작 -----") val projects = projectRepository.findAllByIsActive(true) assertThat(projects).hasSize(DATA_SIZE) println("projects.size: ${projects.size}") for (project in projects) { assertThat(project.details).hasSize(project.name.toInt()) println("project.details.size: ${project.details.size}") assertThat(project.skills).hasSize(project.name.toInt()) println("project.skills.size: ${project.skills.size}") } println("----- findAllByIsActive 테스트 종료 -----") } }
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
API 구축시 인텔리제이
안녕하세요 이제 시작해보려구하는데 ㅎㅎAPI 구축시 인텔리제이 사용해도 문제없나요??
-
해결됨입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
테스트코드 실행중 오류와 경고에 관한 질문 입니다.
현재 강의는 ExperienceRepository코드를 테스트하는 코드인데 interface HttpInterfaceRepository : JpaRepository<HttpInterface, Long>{ fun countAllByCreatedDateTimeBetween(start: LocalDateTime, end: LocalDateTime): Long }제가 이런식으로 HttpInterfaceRepoistory에 사용자 정의 메서드이름을 잘못 설정했어서테스트 코드 실행중에 오류가 발생하여이런식으로 실행이 안되었습니다.HttpInterfaceRepository와 관려 없는 코드 같은데 왜 오류가 발생하는 건가요?그리고 저 오류를 발견해서 HttpInterfaceRepository 를 수정하고 실행을 하니 정상적으로 실행은 되었는데이 경고가 뜹니다 이건 어떤건가요?프로젝트 리포지토리 테스트가 계속 실패하는데 왜 그런건가요? https://drive.google.com/file/d/1s2JngsdGhN_iOUf6llkkcUwwISIuCTUp/view?usp=sharing구글 드라이브에 소스코드 압축해서 업로드 했습니다
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
sql distinct 질문
sql distinct는 완전히 같은 것의 중복을 제거해준다고 배웠습니다.id를 사용한다는 가정에서 완전히 같을 경우가 존재할 수 있나요? jpql distinct 키워드는 sql distinct에 더불어 엔티티 중복을 피하게 해주는데 sql distinct는 필요없는 과정이 아닌가 싶었습니다.
-
미해결실전! Querydsl
Querydsl 버전 별 build.gradle 설정 파일에 대해 궁금한 점이 있습니다.
자주 하는 질문 + 강의 자료를 종합해봤을 때 Querydsl 설정이 크게 다음 3가지로 나뉘는 것 같더라고요. 2.x 버전 / dependencies 바깥에 설정plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } 2.x 버전 / dependencies 안에 설정 dependencies { //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } 3.x 버전 / dependencies 안에 설정 dependencies { //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } 2.x 의 경우 선택지가 2가지가 되는 데 왜 강의에선 1번 케이스를 선택했던 건지 궁금합니다! 2번 선택지가 더 깔끔한 거 아닌가요 ?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
apigateway 프로젝트 생성하고 실행시 Timout이출력 됩니다.
안녕하세요 강사님, 강의 영상 잘 보고 있습니다.first-service, second-service 둘다 실행 후에 apigateway-service 실행했습니다. 그런데 apigateway 쪽에서 연결 거부 당했다는 로그가 지속적으로 올라오네요 이유를 모르겠습니다. apigateway 의 application yml파일여기서 궁금한게 defaultZone 설정 해서, discoveryservice 프로젝트도 구동 시켜줬는데, 같은 에러로그가 지속 적으로 올라오네요..server: port: 8000 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apigateway-service cloud: gateway: routes: - id: first-service uri: localhost:8081/first-service predicates: # ??? Path ??? first-service?? ?? uri? ?? - Path=/first-service/** - id: second-service uri: localhost:8082/second-service predicates: # ??? Path ??? second-service?? ?? uri? ?? - Path=/second-service/**콘솔 내용2024-10-07 20:39:53.214 WARN 2024 --- [OvbxrBtUd7XQ-87] o.s.a.r.l.SimpleMessageListenerContainer : Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: no further information 2024-10-07 20:39:53.214 INFO 2024 --- [OvbxrBtUd7XQ-87] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@4dca89d2: tags=[[]], channel=null, acknowledgeMode=AUTO local queue size=0 2024-10-07 20:39:53.215 INFO 2024 --- [OvbxrBtUd7XQ-88] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672] 추가 예외2024-10-07 20:51:37.290 INFO 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888 2024-10-07 20:51:37.304 INFO 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available 2024-10-07 20:51:37.304 WARN 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/apigateway-service/default": Connection refused: no further information; nested exception is java.net.ConnectException: Connection refused: no further information
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Dip, @transactional
안녕하세요! 강의를 듣고, 궁금증이 생겨서 찾아보던 중 명확한 답을 얻지 못해서 질문드립니다!.첫째로 DIP에 관련된 질문입니다.회원가입과 비밀번호 암호화 강의 중 "DTO를 서비스 계층으로 바로 넘기는 게 좋지 않다"고 하셔서 궁금증을 가지고 찾아보던 중에이 질문을 보고 관련 내용들을 찾아봤지만, 궁금증을 완전히 해결하지 못해서 질문드립니다.public class Auth ControllerAuthController { private final Auth ServiceAuthService auth ServiceauthService; private final ?AppConfig ?appConfig; @Post MappingPostMapping("/APIapi/auth/signup") public void signup(@Request BodyRequestBody Signup signup) { auth ServiceauthService. signup(signup).signup(signup); }}위와 같은 코드가 있을때 DIP를 지키면서 코딩한다면 단순히 Controller -> Service로 넘기기 위한 전달용 DTO를 만들어서 사용하시는지 궁금합니다.두 번째로 @transactional에 관한 질문입니다.데이터의 수정 및 변동이 있는 부분에는 @transactional을 붙이는 것이 좋다고 들어왔습니다. 그런데 강의의 코드에서는 붙인 부분과 안 붙인 부분이 나뉘는데 특별한 이유가 있을까요?또 한 readonly 속성은 데이터를 읽기만 하는 부분에서는 성능에 도움이 된다고 들었습니다.위의 내용들로 데이터의 변동이 일어나는 부분엔 @transactional을 붙이고, 읽어오기만 하는 부분에는 readonly 속성을 습관적으로 붙여왔는데 호돌맨님 께서는 @transactional을 사용하는 기준(?) 같은게 있으실까요?긴 질문 읽어주셔서 감사합니다 :)
-
해결됨Spring Boot를 활용하여 채팅 플랫폼 만들어보기
@Transactional(transactionManager = "createChatTransacationMansger") 질문 있습니다.
질문1: 강의에서 saveChatMessage() 메소드 진입시 @Transactional(transactionManager = "createChatTransacationMansger") 사용하는것을 말씀 해주셨는데요. 선생님께서 말씀해주신 강의 내용을 그대로 말씀드리자면 " 웹소켓 같은 경우에는 하나의 커넥션 즉 세션을 하나에 계속 공유하고 계속 사용 중이기 때문에 이 스톰프를 사용하는 웹소켓 통신 아니면 기본적인 웹소켓 통신에서도 이 트랜잭션에 대한 경계가 되게 명확하지가 않는 경우가 있습니다. " 즉 이 말씀은 따로 이렇게@Transactional public void saveChatMessage(Message msg) { chatRepository.save(chat); } @TransactionManager() 만 추가해서 관리 하면 문제가 생기고 @Transactional(transactionManager = "createChatTransacationMansger")이렇게 별도로 TransactionManager 를 추가해서 관리 해야 문제가 없다고 이해 하면 될까요??? 왜 TransactionManager 를 따로 만들어서 관리하는지 이해가 안가네요 ㅠ,ㅠ그리고 "웹소켓 같은 경우에는 하나의 커넥션 즉 세션을 하나에 계속 공유하고 계속 사용 중이기 때문에 이 스톰프를 사용하는 웹소켓 통신 아니면 기본적인 웹소켓 통신에서도 이 트랜잭션에 대한 경계가 되게 명확하지가 않는 경우가 있습니다"즉 이 말씀은 saveChatMessage 경우는 웹소켓 전용만 사용 할때만 이용하는 오퍼레이션 이기 때문에 다른 HTTP 통신 경우에 오는 FLOW 경우는 saveChatMessage() 메소드는 사용하지 마라 라는 의미로 @Transactional(transactionManager = "createChatTransacationMansger")이렇게 별도의 TransactionManager을 사용한 것인지 궁금 합니다. 질문2 선생님이 말씀해주신 내용을 그대로 말씀드리자면플러시는 기본적으로 JPA에서 다루고자 하는 트랜잭션이 담겨있어야 되는데 담겨있지 않았다는 에러가 발생하게 될 거예요 왜냐하면 제가 말씀드렸던 것처럼 웹소켓은 하나의 통신으로만 공유를 하기 때문에 경계가 명확하지 않아서 JPA 에서 일반적으로 트랜지액션을 잘 인식을 하지 못하고 잘 넣어주지를 못합니다 이렇게 트랜젝션을 선언하지 않으면 문제가 발생된다고 해주셨는데요. @Transactional public <S extends T> S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (this.entityInformation.isNew(entity)) { this.entityManager.persist(entity); return entity; } else { return this.entityManager.merge(entity); } }JPA save 메소드를 보면 이렇게 @Transaction 을 선언하기 때문에 굳이 @Transaction 을 선언하지 않아도 문제가 없지 않을까요??