묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 데이터 JPA
PK값을 이미가지고 있는 Entity를 DB에 저장하는 방법 문의
안녕하세요. Jpa린이 입니다. 좋은 강의 감사합니다. MSA형태로 Application을 구성하려고 합니다. 아래와 같은 경우에 2번DB에 save할때 Jpa가 내부적으로 pk를 가지고 먼저 select하는것 같은데, 2번DB에는 당연히 해당데이터가 없으니 에러가 발생하는 군요. PK 값을 가지고 있지만 select없이 바로 저장하게 할 수 있을까요? --아래-- 1번DB와 2번DB의 위치는 다르지만, 테이블구조와 데이터는 동일해야합니다. Eqp1Tr과 Eqp1TrDet는 1:N 구조입니다. 1번 App - 1번 DB에 저장 -> Kafka Publish (ID포함) 2번 App - Kafka Consume (ID포함) -> 2번 DB에 저장 <2번 App Consumer 와 Service 코드> @KafkaListener(topics = "${app.topic.name}", groupId = "${spring.kafka.consumer.group-id}")public void receiveMessage(@Payload Eqp1Tr eqp1Tr, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) Integer partition, @Header(KafkaHeaders.OFFSET) Long offset) { log.info("Received message: data = {}, topic = {}, partition = {}, offset = {}", eqp1Tr, topic, partition, offset); eqp1TrService.createTr(eqp1Tr);} public Eqp1Tr createTr(Eqp1Tr eqp1Tr) { log.info("eqp1Tr : {} {}", eqp1Tr.getEqp1TrDets(), eqp1Tr.getName()); List<Eqp1TrDet> eqp1TrDets = eqp1Tr.getEqp1TrDets().stream() .collect(Collectors.toList()); // Save at Eqp1Tr, Eqp1TrDet trRepository.save(eqp1Tr); trDetRepository.saveAll(eqp1TrDets); return eqp1Tr;} <Error> ... Hibernate: select eqp1trdet0_.id as id1_1_0_, eqp1trdet0_.createdBy as createdb2_1_0_, eqp1trdet0_.createdDate as createdd3_1_0_, eqp1trdet0_.col1 as col4_1_0_, eqp1trdet0_.col2 as col5_1_0_, eqp1trdet0_.tr_id as tr_id6_1_0_ from Eqp1TrDet eqp1trdet0_ where eqp1trdet0_.id=? 2021-04-24 00:05:45.319 TRACE 19496 --- [ntainer#0-0-C-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [2] 2021-04-24 00:06:25.719 INFO 19496 --- [ntainer#0-0-C-1] o.a.k.clients.consumer.KafkaConsumer : [Consumer clientId=consumer-tr-consumer-service-1, groupId=tr-consumer-service] Seeking to offset 3 for partition eqp.tr.ic.eqp1-0 2021-04-24 00:06:27.013 ERROR 19496 --- [ntainer#0-0-C-1] essageListenerContainer$ListenerConsumer : Error handler threw an exception org.springframework.kafka.KafkaException: Seek to current after exception; nested exception is org.springframework.kafka.listener.ListenerExecutionFailedException: Listener method 'public void me.kalpha.trconsumerservice.trmart.service.Eqp1TrConsumerService.receiveMessage(me.kalpha.trconsumerservice.trmart.entity.Eqp1Tr,java.lang.String,java.lang.Integer,java.lang.Long)' threw exception; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is javax.persistence.EntityNotFoundException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is org.springframework.orm.jpa.JpaObjectRetrievalFailureException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2; nested exception is javax.persistence.EntityNotFoundException: Unable to find me.kalpha.trconsumerservice.trmart.entity.Eqp1TrDet with id 2 ...
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 커넥트 서버 기동시 발생하는 오류
안녕하세요 선생님, 좋은 강의 잘 듣고 있습니다. 오늘은 카프카 커넥션 서버 기동시 발생하는 오류가 있어 질문드립니다. 우선, 발생하는 오류에 대한 로그 정보는 아래와 같습니다. log4j:ERROR Could not read configuration file from URL [file:C:/kafka_demo/confluent-6.1.0/config/tools-log4j.properties]. java.io.FileNotFoundException: C:\kafka_demo\confluent-6.1.0\config\tools-log4j.properties (지정된 경로를 찾을 수 없습니다) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86) at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184) at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557) at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526) at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66) at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72) at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388) at org.apache.kafka.connect.cli.ConnectDistributed.<clinit>(ConnectDistributed.java:57) log4j:ERROR Ignoring configuration file [file:C:/kafka_demo/confluent-6.1.0/config/tools-log4j.properties]. log4j:WARN No appenders could be found for logger (org.apache.kafka.connect.runtime.WorkerInfo). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.RootResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.RootResource will be ignored. 4월 22, 2021 10:13:58 오후 org.glassfish.jersey.internal.Errors logErrors WARNING: The following warnings have been detected: WARNING: The (sub)resource method listLoggers in org.apache.kafka.connect.runtime.rest.resources.LoggingResource contains empty path annotation. WARNING: The (sub)resource method createConnector in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectors in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectorPlugins in org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource contains empty path annotation. WARNING: The (sub)resource method serverInfo in org.apache.kafka.connect.runtime.rest.resources.RootResource contains empty path annotation. 위 로그를 보고 confluent-6.1.0 폴더에 config\tools-log4j.properties 라는 파일이 없어 이 문제가 발생한다고 생각 했습니다. 그래서 카프카 서버를 설치한 곳에 있는 \config\tools-log4j.properties 파일을 복사해 생성해주었지만 또 다른 오류가 발생하고 해결이 되지 않았습니다. 하지만, 동작은 선생님께서 하신 실습처럼 정상적으로 동작합니다. 다만 로그가 발생하지 않고 있습니다. 검색을 해봤지만 해결하지 못해 도움 부탁드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 연관관계에서의 편의 메서드
강의중, 연관관계 편의 메서드는 연관관계의 주인으로 설정된 엔티티에서 형성하는 것이 좋다고 하셨는데 Order 엔티티에 //연관관계 메서드public void setMember(Member member) { this.member = member; member.getOrders().add(this);}public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this);}public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this);} 이렇게 메서드를 구성했습니다. 그러나 Order - OrderItem 두 엔티티가 갖는 연관관계에서 주인은 OrderItem입니다. 그렇다면 Order에 .addOrderItem()을 없애고 OrderItem 엔티티에 public void setOrder(Order order){ this.order = order; order.getOrderItems().add(this);} 위와 같은 편의 메소드를 추가하는것이 맞지 않을까 질문합니다!
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
개인 프로젝트를 위해 도움 요청합니다!
안녕하세요. 비전공자로써 국비지원 학원을 수료한 취준생입니다. 학원에서 만들었던 프로젝트가 포트폴리오로 내세우기에는 너무나도 부족해서 선생님의 강의를 들으며 프로젝트를 새로 만들 계획입니다. 프로젝트를 만드는 과정에서 무척 궁금한 부분이 생겼는데 바로 '이미지 첨부'에 관한 것입니다. 학원에서 프로젝트를 만들 때는 모르는 부분이 있으면 구글링하고 이것저것 헤딩해보면서 하다보니 그때 사용했던 방법은 Multipart를 통해 이미지를 프로젝트 파일 내에 있는 폴더에 저장하는 방식을 사용했습니다. 하지만 돌이켜 생각해보니 이미지를 많이 사용하는 사이트를 만든다고 했을 때, '프로젝트 파일의 용량이 너무 불어나면 안 좋지 않을까?' 하는 생각이 들었고, 또한, 기왕에 프로젝트 제대로 만들어 볼 거 AWS Free tier를 활용해서 배포까지 해야 취업에 유리하지 않을까 싶어서 배포단계까지 가는 것을 목표로 하고 있는데요. 그렇다고 했을 때, 배포 중인 애플리케이션의 이미지 첨부 기능에 에러사항이 있지는 않을까, 하는 걱정이 앞섭니다. (아직 애플리케션을 배포해 본 경험은 없습니다...) 사실, 구글 클라우드 스토리지라는 것이 있다기에 연동은 해봤지만 제대로 활용해보지는 못했습니다. 필요하다고 하면 다시 제대로 배워 볼 생각입니다. 이하 각설하고 제 질문은, 1. 실무에서 이미지 첨부 기능을 주로 어떤 스토리지 방식에 의존하는지 2. 작은 규모의 프로젝트이지만 이미지가 약 100장(+이미지 첨부 게시판) 정도일 때 어떤 스토리지 방식을 채택하는 것이 좋을지 입니다. 이게 참... 강의 주제에 벗어나는 질문이지만 너무 궁금한 부분이고, 비전공자이다보니 주변에 실무 종사자 분들이 없어서 실례를 무릅쓰고 이런 질문을 올려보게 되었습니다. 혹시라도 다른 실무 종사자 분들의 조언이 또 있다면 감사히 받겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 관계에서 mappedBy를 지정하지 않으면 어떻게 되나요?
제가 이해가 부족해서 OneToOne 관계에서 서로 단방향?을 걸어버린 구조가 있는데요. 실제 구조로 보면 이렇게 돼있습니다. 실제론 FK를 사용하지 않아서 FK가 걸려있진 않습니다. 구조만 서로 Id를 DB에서 갖고 있습니다. 코드는 서로 @OneToOne에 @JoinColumn을 걸었습니다. Member와 Locker 둘다요. 이렇게 되면 발생할 수 있는 문제가 어떤게 있을까요..? 그리고 이렇게 하면 양방향에서 EAGER만 되는걸 해결할 수 있는지도 궁금합니다.
-
미해결실전! Querydsl
혹시 JPA에서 table partition 을 관리할 수 있나요?
안녕하세요. 강의를 수강하고 있는 도중에 로그성 테이블에 대해서 table partition을 JPA를 통해 생성하고 관리할 수 있는지 궁금합니다. 인터넷을 찾아보니... EclipseLink 에서 table partition 을 지원한다고 하는데요.. spring data jpa 에서도 제공되는지 궁금합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
@SequenceGenerator 를 통한 시퀀스 생성시 에러
안녕하세요 선생님, 복습겸 다시 보고 있는데 뭔가 이해가 안되는 현상이 생겨서 질문드립니다. 제가 처음에는 선생님이 하는 방식대로 아래처럼 @SequenceGenerator를 사용했습니다. @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 1 ) 그러고 나서 JpaMain으로 테스트를 해서 시퀀스 생성 + insert 되는 거까지 확은을 했습니다. 그런데 initialValue와 allocationSize는 default 값이 각각 1, 50 이라길래, 아래처럼 코드를 수정하고 바로 JpaMain 을 다시 실행해봤습니다. @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ" ) 그랬더니... "The increment size of the [MEMBER_SEQ] sequence is set to [50] in the entity mapping while the associated database sequence increment size is [1]" 이라는 에러가 터집니다. 심지어 DDL 조차도 로그에 찍히지 않습니다. 원래라면 persistence.xml 에서 hibernate.hbm2ddl.auto 를 create 로 주었으니, 기존 시퀀스는 다 drop 하고 다시 생성하는 DDL 이 보이면서 동작할 텐데, 그러지도 않네요. 어디서부터 잘못된건지 감이 안 잡힙니다. 대체 왜 이러는 걸까요?
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
SOA 와 MSA 의 가장 뚜렷한 차이는 무엇인가요?
제가 본 대로라면 둘 다 서비스 간의 결합은 낮지만 통신하는 방법이 다른것(API 통신 / ESB 패턴)과 SOA는 언어나 DB에 대한 종속성이 있고 API는 서비스마다 다른 언어 및 DB를 사용해도 문제없다 정도인것 같은데 이 것 말고도 뚜렷하게 구분되는 둘 만의 특징이 있나요?
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
참가 신청 로직과 비슷한 구조 제작 중 이슈가 생겨서 도움 요청드립니다.
안녕하세요. 강사님!강의해주신 내용 중 Event-Enrollment 연관매핑되어 참가신청하는 로직을 참고하여 개발중에 있습니다. 저는 Shop과 Product 를 Event, Enrollment와 동일한 구조로 개발하였는데, Shop 엔티티에 매핑되어있는 products 에 add할 때 NullPointerException 을 발생시키네요. products에 new ArrayList<>(); 로 초기화도 시켜두었는데 에러 나는 이유가 무엇일지 알려주시면 감사하겠습니다!메인Runner 클래스에서 테스트한건데 그부분이 문제일까요?.. <강의 내 Event, Enrollment 관련 코드> -- Event.java @OneToMany(mappedBy = "event") @OrderBy("createdDate") private List<Enrollment> enrollments = new ArrayList<>(); // 생략 public void addEnrollment(Enrollment enrollment) { this.enrollments.add(enrollment); enrollment.setEvent(this); } -- Enrollment.java @ManyToOne private Event event; -- EventService.java public void newEnrollment(Account account, Event event) { if(enrollmentRepository.existsByEventAndAccount(event, account)) { throw new IllegalArgumentException("이미 참가 신청된 계정입니다."); } Enrollment enrollment = Enrollment.builder().account(account).build(); enrollmentRepository.save(enrollment); event.addEnrollment(enrollment); } <제 코드> -- Shop.java public class Shop extends CommonField { @Id @GeneratedValue private Long id; private String shopName; private String siteUrl; @OneToMany(mappedBy = "shop") @OrderBy("createdDate") private List<Product> products = new ArrayList<>(); public void addProduct(Product product) { this.products.add(product); // --> this.products에서 NullPointerException 발생!! product.setShop(this); } } -- Product.java public class Product extends CommonField { @Id @GeneratedValue private Long id; @Column(unique = true) private String productId; private String title; private String price; private String thumbUrl; private String detailUrl; @ManyToOne private Shop shop; } -- 테스트 코드 private void CrawlerTest() throws IOException { // 쇼핑몰 생성 Shop shop = Shop.builder().shopName("미스터스트리트").siteUrl("https://mr-s.co.kr/").build(); shopRepository.save(shop); Shop newshop = shopRepository.findByShopName(shop.getShopName()); // 최신 상품 목록 크롤링 Crawler crawler = new mrStreetCrawler(shop.getSiteUrl()); List<Product> products = crawler.run(); // 연관관계 설정 for(Product product : products) { product = productRepository.save(product); newshop.addProduct(product); // --> 에러 발생 } }
-
미해결스프링 데이터 JPA
JPA JoinColumn에서 지정한 FK에 자동으로 값 넣기
안녕하세요. 강의 도중 궁금한점이 있어 질문 드립니다. School Entity와 Student Entity를 Join 관계로 지정하였습니다. [School Entity] @Table(name = "school") public class SchoolVo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Integer id; @Column(name = "school_name", nullable = false) private String schoolName; @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="schoolVoList") private List<Student> student = new ArrayList<>(); } [Student Entity] @Table(name = "student") public class StudentVo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Integer id; @Column(name = "school_id", nullable = false) private int schoolId; @Column(name = "student_name", nullable = false) private String studentName; @ManyToOne @JoinColumn(name = "school_id_fk") private SchoolVo schoolVoList; } repository.save를 이용하여 student 테이블에 값을 추가하려고 합니다. 이때 FK인 "school_id_fk"에만 값이 들어가지 않는데요. FK에 접근하려면 어떻게 하면 될까요? FK키에 자동으로 schoolId 값이 들어가도록 하고 싶습니다. Student 테이블에 값을 저장한 소스는 아래와 같습니다. @PostMapping("/local") public StudentVo setStudentInfo(@RequestBody StudentVo newStudent) { return studentRepository.save(newStudent); } 그리고 다른 이야기이지만.. Student Table에 school_id 컬럼이 있음에도 불구하고 FK를 별도로 지정해 주는 방법은 효율적인 건가요? 2컬럼이 계속 같은 값이 들어갈텐데 인터넷 검색해보니 가시성도 높아지고 별도로 해주는게 좋다고도 하던데 굳이 같은 값이 들어가는 컬럼을 중복해서 만들 필요가 있는지, FK없이 JPA에서 테이블간의 조인도 가능한지 궁금합니다! 질문이 쫌 많아졌지만... 조언 부탁 드립니다^^ 감사합니다.
-
미해결실전! 스프링 데이터 JPA
Unit Test 관련 질문입니다.
안녕하세요 영한님 ! 어제 h2 관련해서 질문을 드렸었는데요 좋은 답변 감사했습니다! 다름이 아니라 service unit test 를 하는 과정에서 repository 의 Pageable 을 mock 으로 주입해야 하는 상황이 왔습니다. 현재 junit 5 의 bdd 를 이용해서 테스트를 하고 있는데요, junit5의 bdd 역시 영한님은 잘 아시겠지만 given()을 이용해서 JpaRepository.findAll(Pageable pageable) 이 호출되면 willReturn() 으로 반환되는 반환 값을 가짜로 주입해야 하는 상황입니다. 하지만 여기서 어떻게 Page<Entity> pagedEntitied 를 주입해야 하는지 몰라 진행이 힘들더라구요 ㅠㅠ 수업의 방향과 상관 없는 내용이라 실례임을 인지하고 있지만 어떻게 해결해야 할지 도통 갈피를 못 잡아서 질문드려 봅니다.. import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; class MemberServiceTest { private MemberService memberService; private final MemberRepository memberRepository = mock(MemberRepository.class); @BeforeEach void setUp() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE) .setFieldMatchingEnabled(true); memberService = new MemberService(memberRepository, modelMapper); // 문제의 willReturn 반환 타입.. 현재는 null을 넣어놨습니다. given(memberRepository.findAll(any(PageRequest.class))).willReturn(null); } @Test @DisplayName("모든 사용자 조회") void getMembers() { // when PageRequest pageRequest = PageRequest.of(0, 5); // then Page<MemberResponseData> pagedData = memberService.getMembers(pageRequest); assertEquals(pagedData.getSize(), 5); } } @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String email; private String password; private String nickname; public static MemberResponseData fromEntity(Member member) { return MemberResponseData.builder() .email(member.getEmail()) .nickname(member.getNickname()) .build(); } } // Page<MemberResponseData>에 해당하는 MemberResponseData(DTO) @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class MemberResponseData { private String email; private String nickname; } // MemberService @Service public class MemberService { private final MemberRepository memberRepository; private final ModelMapper modelMapper; public MemberService(MemberRepository memberRepository, ModelMapper modelMapper) { this.memberRepository = memberRepository; this.modelMapper = modelMapper; } /** * 모든 회원을 조회한다. * * @param pageable : 페이징 정보 * @return 모든 회원 */ public Page<MemberResponseData> getMembers(Pageable pageable) { return memberRepository.findAll(pageable).map(Member::fromEntity); } }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 타입 컬렉션에서 일대다 매핑으로 바꾼 뒤!
수정을 하고 싶을 때, 값 타입 컬렉션 경우에는 .remove()와 .add()를 사용하여 아래와 같이 했습니다. findMember.getAddressHistory().remove(new AddressEntity("oldCity1", "street1", "10000"));findMember.getAddressHistory().add(new AddressEntity("newCity1", "street1", "10000")); 그렇다면, AddressEntity를 사용하여 엔티티의 경우에는 아래와 같이 사용하면 되나요? AddressEntity addressEntity = em.find(AddressEntity.class, 2L);Address address = new Address("newCity1", "street1", "10000");addressEntity.setAddress(address); setAddress와 같이 커밋시점에 변경 감지로 수정을 할 수 있다고 생각했습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
UUID 사용 이유
안녕하세요! 아직 학생이라 모르는 부분이 많아 자주 질문을 드리네요 ㅎㅎ.. 항상 감사하게 생각하고 있습니다. 다름이 아니라 email 이 아니라 UUID를 이용해서 토큰을 만드는 이유에 대해서 궁금합니다. 검색을 해보니 UUID는 를 사용하는 이유는 중복되지 않게 하기 위함 이라고 이해하였습니다. 하지만 사용자 관련 서비스에서 회원가입 시에 email이 동일한 사용자는 회원가입이 안되게 한다면 중복성에 대한 문제는 해결할 수 있지 않을까? 그럼 users 테이블에 있는 id 컬럼과 userId 컬럼 중 하나는 사라져도 되겠다. 그럼 DB에 저장해야할 칼럼도 줄어들고, 더 좋지 않을까? 라고 생각을 하게 되었습니다. 하지만 강사님이 users 테이블에 id 컬럼과 userId 컬럼을 두면서 까지 UUID 를 쓰는 이유는 분명히 존재할 것 같아서 이렇게 질문 올려봅니다..!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원가입 제출 이후 whiteLabel
안녕하세요 강사님. 강의 보며 많이 배우고 있습니다. 강의 내용대로 쭉 따라가며 진행하고 있는데 회원가입 부분에서 회원가입 제출 누르면 홈으로 리다이렉트가 안되고 403에러와 화이트라벨 페이지로 이동하게 됩니다. create 메서드에 로그를 찍어도 안찍히는걸 보니 해당 post 매핑이 잘못되었나 하여 준비해주신 자료에 있는 소스를 복사해 똑같이 붙여넣기해도 마찬가지네요... 혹시 원인이 무엇일까요..ㅠㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
NoSQL과 JPA 관련 질문입니다.
안녕하세요 영한님 매일매일 강의 정말 너무너무 잘 듣고 있습니다. 수업과 살짝 관계가 없을 수도 있는 질문일수도 있지만 궁금해서 여쭤봅니다 ... ^^ 수업에서 사용하시는 케이스는 전부 관계형 데이터 베이스를 사용하는 경우, JPA를 어떻게 잘 사용할지에 대한 내용인 것 같은데 혹시 NoSQL 계열의 데이터베이스를 사용할 경우에는 JPA를 사용하는 것이 비효율적인지 또는 사용을 못하는건지 같은 관점에서 궁금합니다 (찾아보니까 몽고DB랑 같이 사용하는 케이스가 있는 것 같긴하던데..잘 감이 안오더라구요) 답변 주시면 감사하겠습니다!!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
actuator 인증 관련
안녕하세요 선생님, actuator 관련해서 질문이 있습니다. 실습에서 actuator 관련해서 user-service의 WebSecurity에는 아래와 같은 코드를, http.authorizeRequests().antMatchers("/actuator/**").permitAll(); apigateway-service의 application.yml 파일에서는 아래와 같은 코드를 추가했습니다. - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/actuator/** - Method=GET, POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment} 제가 궁금한 것은, actuator로 누구나 접근할 수 있게 permitAll() 설정을 해주었고, 인증 필터 또한 설정하지 않았는데 포스트맨으로 actuator 접근할 시 토큰이 필요한 이유에 대해 잘 모르겠습니다. (8분 15초 이후 관련)
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
userDetails의 password 관련
안녕하세요 선생님, 선생님 강의 중 10분 17초 이후에 나오는 설명과 관련하여 질문이 있습니다. userDetails의 필드 중 pwd, encryptedPwd가 있습니다. pwd는 로그인 시 사용자가 입력한 패스워드가 암호화된 값, encryptedPwd는 회원가입시 사용자가 입력한 패스워드가 암호화된 값. 이라고 이해했습니다. 위처럼 제가 이해한 내용이 맞을까요? 맞다면 추가 질문드릴게 있습니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원가입 시 비밀번호 입력에 대한 질문
안녕하세요 영한님 질문이 있습니다. 회원가입을 할 때 비밀번호를 입력하는 예제를 만들어 보려고 합니다. 회원가입 시에 비밀번호를 입력하고 비밀번호 확인을 입력하여 둘이 같으면 회원가입을 요청하도록 로직을 짜려고 하는데, 이 로직을 어느 계층에 넣어야 할지 고민이 됩니다. 비밀번호 확인이라는 칼럼을 멤버 클래스에 추가하지 않고 클라이언트에서 넘겨준 데이터를 확인만 하고 버리려고 하는데 그러면 MemberApiController에서 직접 처리를 해야하는 걸까요? 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jpa msa 에 대한 질문입니다!
안녕하세요 강사님! 강의 너무 재밌게 잘 보고있습니다! . 마이크로서비스 환경에선 jpa 연관관계 맵핑(@OneToMany, @ManyToOne...) 이런게 불가능할 것 같은데 그래서 설정을 하지 않으신건지 궁금합니다! 또한 마이크로 서비스에선 외래키같은 설정은 따로 안해줘도 되는건가요?!
-
미해결실전! Querydsl
queryDsl에서는 DATE 함수 지원 하지 않나요?
SELECT * FROM member AS m INNER JOIN history AS h ON (m.id = h.id) WHERE DATE(h.created_at) = DATE_ADD(CURDATE(), INTERVAL -1 DAY) 해당 쿼리문을 만들어야 하는데요... 지금 까지 제가 해본 것 입니다!!!! 함수 () { LocalDate minusDays = LocalDate.now().minusDays(1); DateTemplate<LocalDate> localDateDateTemplate = Expressions.dateTemplate(LocalDate.class, "DATE({0},'%Y-%m-%d')", subQEmrConsultationHistory.createdAt, ConstantImpl.create("%Y-%m-%d")); BooleanBuilder booleanBuilder = new BooleanBuilder(); booleanBuilder.and(localDateDateTemplate.eq(minusDays)); return queryFactory .from(qhistory) .join(qhistory.member) .where(booleanBuilder) } 이렇게 한번 해보았는데 당연히 안되었네요... 이방법이 아닌거 같은데요... 이 경우 어쩔수 없이 Mybatis로 가야하나요....