묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
JPA 식별관계 사용에 대해서...
Jpa를 사용할 때 테이블 관리를 쉽게 하기 위해서 비식별 관계로 테이블을 설계하라고 들었는데 그러면 실무에서 jpa쓸 때 식별관계를 안쓰나요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api 작성중에 enum type 문의 드립니다.
이전 jpa활용 1편에서 작성했던 부분들을 api로 변경을 진행중입니다. 다른 부분들은 잘 진행되고있지만java 기초가 부족해서 enum으로 만든 OrderStatus부분을 어떻게 처리해야될지 감이 잡히질 않아 문의드립니다.처음 주문 내역페이지를 호출 할 때 주문상태(OrderStatus) 부분을 api로 받아 select 구성을 해야합니다. 이 때 enum을 배열로 변환(?)해서 넘기는게 맞는 방법일까요? 조회시 주문상태(OrderStatus)와 회원이름을 form으로 넘길때 Controller에서는 @RequestBody OrderSearch로 받으며 주문상태는 OrderStatus로 선언되어있습니다. 자동 맵핑이 안되는거같은데 enum type을 request로 어떻게 받아야하는지 궁금합니다. 질문이 잘 전달되었을지 모르겠지만 답변부탁드리겠습니다.감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
table 생성오류
안녕하십니까 쌤 다음과 같이 진행했는데 여기서 막혀서 질문드립니다. H2 문법을 따로 공부를 해야될듯한데 시간이 조금 오래걸릴것같아 이렇게 질문드립니다. (H2 문법까지 굳이 공부할 필요가 없어보여서...)
-
미해결
1:N 관계에서
특정 게시글을 조회하고 싶을 때 작성된 댓글들도 같이 보고 싶은데 InvalidDefinitionException: Direct self-reference leading to cycle 관련하여 에러가 뜹니다.@JsonIgnore로 해결하기보다 ResponseDto로 만들어서 entity -> ResponseDto로 변환해서 응답하고 싶습니다. 그래서 ResponseDto를 만들어서 entity -> ResponseDto로 변환했는데 저런 에러가 뜹니다. 어떻게 해결해야하는지 도와주세요그리고 @Builder를 사용해 빌터패턴을 적용할 때 인자가 많아질 경우 아래처럼 인자가 저렇게 길어지는 것이 맞는 건가요?? @Builder public ArticleResponseDto(Long id, String title, String content, LocalDateTime createdDate, LocalDateTime updatedDate, List<Hashtag> hashtags, List<Comment> comments) { this.id = id; this.title = title; this.content = content; this.createdDate = createdDate; this.updatedDate = updatedDate; this.hashtags = hashtags; this.comments = comments; }
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
application.properties 질문 드립니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.JPA 설정을 persistent.xml에서 설정 내용들을 적어주는데 혹시 spring boot에서 할때는 persistent.xml 말고 application.properties에서 persistent-unit name을 따로 설정 할 수 없을 까요?
-
미해결자바 스프링부트 활용 웹개발 실무용
3강 Swagger 컴파일 에러
swagger 의존성 추가하고 똑같이 코드 작성했는데 오류가 납니다java.lang.IllegalStateException: Failed to introspect Class [kr.co.songjava.configuration.SwaggerConfiguration] from ClassLoader [org.springframework.boot.devtools.restart.classloader.RestartClassLoader@36fd7761] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:485) ~[spring-core-5.3.22.jar:5.3.22] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:361) ~[spring-core-5.3.22.jar:5.3.22] at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:418) ~[spring-core-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$2(AbstractAutowireCapableBeanFactory.java:765) ~[spring-beans-5.3.22.jar:5.3.22] at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1688) ~[na:1.8.0_291] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:764) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:703) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:669) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:661) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1300) ~[spring-context-5.3.22.jar:5.3.22] at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:867) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:855) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:842) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:782) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) [spring-boot-2.7.3.jar:2.7.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) [spring-boot-2.7.3.jar:2.7.3] at kr.co.songjava.ExampleSpringApplication.main(ExampleSpringApplication.java:10) [classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_291] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_291] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_291] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_291] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.7.3.jar:2.7.3] Caused by: java.lang.NoClassDefFoundError: springfox/documentation/spring/web/plugins/Docket at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_291] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_291] at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_291] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:467) ~[spring-core-5.3.22.jar:5.3.22] ... 26 common frames omitted Caused by: java.lang.ClassNotFoundException: springfox.documentation.spring.web.plugins.Docket at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_291] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_291] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_291] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_291] at java.lang.Class.forName0(Native Method) ~[na:1.8.0_291] at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_291] at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:145) ~[spring-boot-devtools-2.7.3.jar:2.7.3] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_291] ... 30 common frames omitted오류 코드가 이렇게 나오는데 어느부분이 문제일까요?? 부트는 2.4.0버전이고 swagger 2.9.2입니다
-
미해결
김영한님 로드맵 관련 질문
안녕하세요 자바 지식은 알고 있는데 김영한님의 스프링부트 로드맵부터 들을지 스프링 로드맵부터 들을지 모르겠습니다. 10월달부터 회사에서 스프링부트를 쓰는데 우선순위를 어디에 둬야할지요.... 답변 부탁드립니다
-
미해결
Springboot 스케줄러를 이용한 db 데이터 자동 삭제
스프링부트스케줄러를 이용해서 mysql에 있는 데이터를 자동삭제 하고 싶습니다. 블로그들을 찾아봐도 딱히 쓸만한 정보를 얻지 못해서 이 글을 작성하게 됩니다. 따롴 클래스를 만들던지 해서 controller에서 처리하고 싶습니다. db에 데이터가 삽입된 기준으로 하던지 현재 시간을 기준으로 최근 1달 정도 데이터를 유지하던지 그런 방식으로 진행하고 싶습니다. 알려주십쇼 ..
-
미해결
firebase.fcm.v1.Fcmerror
스프링부트에서 안드로이드로 알림 버튼을 누르면 다음과 같은 오류가 나왔습니다. 블로그들을 찾아보니 키 생성을 다시 하고 키 값이 일치하지 않는다 하여서 파이어베이스에 새로운 프로젝트를 등록하고 키를 새로 생성해서 스프링부트에 넣어줬습니다. 하지만 여전히 문제는 해결이 되지 않습니다. 어떻게 해야 할지 제발 알려주세요.. 2주동안 고생하고 있습니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
setter없이 생성메서드 생성하는 방법
안녕하세요 강사님, 서포터즈님들 JPA 실전까지 모두 완강하고 개인 프로젝트를 진행 중입니다. 강사님께서 강의 때 setter의 사용을 지양하라고 하셨는데, 생성메서드 생성 시 setter를 사용하지 않고 제가 짠 코드대로 해도 문제가 없을까요? --------- 생각해보니까 이것도 setter를 사용한거나 다름 없는 것 같은데, 생성메서드 생성할 때 setter없이 하는 방법이 있나요? @Id @GeneratedValue @Column(name = "fileId") private Long id; private String fileNm; private String path; private Long size; private String extension; private String fileType; @JoinColumn(name = "restaurantId") @OneToOne(fetch = FetchType.LAZY) private Restaurant restaurant; @JoinColumn(name = "menuId") @OneToOne(fetch = FetchType.LAZY) private Menu menu; //생성메서드 public static FileEntity createFile(FileEntity fileInfo) { FileEntity file = new FileEntity(); file.setFile(fileInfo.getFileNm(), fileInfo.getPath(), fileInfo.getSize(), fileInfo.getExtension(), fileInfo.getFileType()); return file; } public void setFile(String fileNm, String path, Long size, String extension, String fileType) { this.fileNm = fileNm; this.path = path; this.size = size; this.extension = extension; this.fileType = fileType; }
-
미해결실전! Querydsl
QueryDsl 메소드에 대한 질문있습니다.
이해를 돕기위해 코드 첨삭합니다. 대략적인 코드의 내용은 유저가 시험을 풀고 유저가 푼 문제를 긁어와서 그 문제들의 한 필드(Temporary) 업데이트 즉, 제출한 시험문제 전체를 업데이트하는 그런코드입니다. Service ------------------------------------------------------------------------------------------ @Transactional @Override public ExamMultiSubjectUpdateResponseDto updateExamTemporary(Long courseUserSeq,Long examSeq) { CourseUser courseUser = courseUserRepository.findById(courseUserSeq) .orElseThrow(() -> new RestException(HttpStatus.NOT_FOUND, "찾을 수 없는 유저-과정 입니다. courseUserSeq = " + courseUserSeq)); Exam exam = examRepository.findBySeq(examSeq) .orElseThrow(() -> new RestException(HttpStatus.NOT_FOUND, "일치하는 시험을 찾을 수 없습니다. examSeq=" + examSeq)); //유저가 시험보기를 누른 첫 스타트 시작시간 가져오기 // (객관식 개수가 0 일수도 있고 주관식개수가 0 일수도 있기때문에 2개의 메소드진행) timeCheckMultiple(courseUserSeq, exam); timeCheckSubjective(courseUserSeq, exam); //유저-과정에 등록된 유저가 객관식, 주관식에 모든 임시데이터를 가져온다. String tYn = "Y"; List<ExamMultipleChoiceResult> multiEntityList = examMultipleChoiceResultRepository.findAllByCourseUserSeqAndTemporaryYn(courseUserSeq,tYn); List<ExamSubjectiveResult> subjectEntityList = examSubjectiveResultRepository.findAllByCourseUserSeqAndTemporaryYn(courseUserSeq,tYn); //시험 테이블에 등록된 주관식 객관식 개수 Integer objCnt = exam.getObjCnt(); Integer subCnt = exam.getSubCnt(); log.info("해당과정을 듣는 유저가 입력한 객관식 = {} :: 해당과정을 듣는 유저가 입력한 등록한 주관식 = {}",multiEntityList.size(),subjectEntityList.size()); // 시험 테이블에 등록된 개수들과 유저가 입력한 개수의 조건 비교 if (multiEntityList.size() + subjectEntityList.size() == objCnt+subCnt){ ExamMultiSubjectUpdateResponseDto examMultiSubjectUpdateResponseDto = examRepository.updateTemporary(multiEntityList, subjectEntityList,courseUser); return examMultiSubjectUpdateResponseDto; } else if (!(multiEntityList.size() + subjectEntityList.size() > 0)){ throw new RestException(HttpStatus.BAD_REQUEST,"제출해야 할 주관식,객관식 데이터가 없습니다."); } else { throw new RestException(HttpStatus.BAD_REQUEST,"모든 객관식, 주관식에 답을 입력해주세요."); } } QueryDsl ---------------------------------------------------------------------------------------- @Override public ExamMultiSubjectUpdateResponseDto updateTemporary(List<ExamMultipleChoiceResult> multiEntityList, List<ExamSubjectiveResult> subjectEntityList, CourseUser courseUser) { //유저가 체크한 문제를 임시 상태(temporaryYn)에서 제출상태로 변경 Y 면 임시 저장상태 N 이면 제출한상태 long multi = queryFactory .update(qExamMultipleChoiceResult) .set(qExamMultipleChoiceResult.temporaryYn, "N") .where(qExamMultipleChoiceResult.in(multiEntityList)) .execute(); long subject = queryFactory .update(qExamSubjectiveResult) .set(qExamSubjectiveResult.temporaryYn, "N") .where(qExamSubjectiveResult.in(subjectEntityList)) .execute(); em.flush(); em.clear(); if (multi == 0 || subject == 0){ throw new RestException(HttpStatus.BAD_REQUEST,"시험 제출에 실패하였습니다."); } //Ip주소가 프록시나 로드밸런서를 통해 호출되는 경우 로드밸런서의 IP가 나온다 //이 경우를 방지하기 위해 X-Forwarded-For 값을 확인하고 없을 경우 getRemoteAddr()을 사용한다. HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest(); String ip = ClientsUtils.getRemoteIP(req); //유저 시험 채점 테이블 기본값 세팅 (유저가 시험 제출을하면 관리자가 어떤유저가 제출한건지 알기위함.) //유저가 이미 제출했던 시험이 있는지 검증 if (!examUserRepository.existsByCourseUserSeq(courseUser.getSeq())){ examUserRepository.save(new ExamUser(courseUser,0.0,null,"Y","N",null, LocalDateTime.now(),null,ip,null)); } else { throw new RestException(HttpStatus.NOT_FOUND,"이미 제출하셨던 시험이 있습니다."); } //위 em.flush(),em.clear() 로 인해 //ExamMultiSubjectUpdateResponseDto 에 업데이트한 쿼리가 담기지않아 새로 호출 List<ExamMultipleChoiceResult> reFindMulti = examMultipleChoiceResultRepository.findAllByCourseUserSeq(courseUser.getSeq()); List<ExamSubjectiveResult> reFindSubject = examSubjectiveResultRepository.findAllByCourseUserSeq(courseUser.getSeq()); return ExamMultiSubjectUpdateResponseDto.builder() .multiEntityList(reFindMulti) .subjectEntityList(reFindSubject) .build(); } 위 코드에서 제가 궁금한 점은 1. QueryDsl 메소드안에서 위처럼 examUserRepository(DI :: 의존성주입)를 써도되는지..혹은 서비스단에서 처리하는게 맞는지.. 2. 위 코드에서 지양해야 하는점이있는지.. 피드백주시면 감사하겠습니다..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[스프링 jdbcTemplate] 6분30초대에 말씀하신 document가 어떤것일까요?
안녕하세요. jdbcTemplate 에 좀 더 알고싶어서 document 관련해서 찾아보고 있는데 대부분의 문서나 블로그들이 그냥 jdbc 로 repository를 구성하는 설명을 하고 있습니다. 혹시 말씀하신 부분에 대해서 들을 수 있는 수업이나 document를 제대로 참조해서 볼 수있는 사이트가 있을까요?? 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Valid 사용이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 Valid 사용 이유에 대해 자세하게 이해하지 못했는데 , 프론트단에서 해당 형식에 맞지 않는 경우 제출이 불가능하도록 만들어주는 방법 외에 제출 후 형식에 맞지 않는다고 다시 화면으로 돌려주는 경우에 사용하면 되는 건가요? React 와 협업시에도 사용이 가능한가요?
-
미해결
스프링 부트 톰캣 로그 설정 질문
안녕하세요.! 톰캣의 스레드, 작업 큐의 갯수를 설정할 수 있다는 사실을 알게되어 이를 런타임에서 확인 해보고 싶은데 방법이 있을까요? server: port: 8081 tomcat: threads: max: 20 # 생성할 수 있는 thread의 총 개수 min-spare: 10 # 항상 활성화 되어있는(idle) thread의 개수 accept-count: 5 # 작업 큐의 사이즈 감사합니다.!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit 테스트관련 질문을 드려요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 안녕하세요 강의가 테스트가 중점은아니지만 강의에서는 mocking에대해 간단하게 언급하고 넘어가주셨는데,, 궁굼한게 조금 있어서 질문드립니다.ㅠ jUnit 테스트 작성시 Controller에 대해 작성할 수도있고, Service를 mocking할수도있고, service도 테스트하고.. 말씀하신 Entity에 비즈니스 로직도 테스트코드를 작성할 수 있을것 같습니다. 여러 테스트 코드를 짤수가 있는데 실무에서는 어디서부터 어디까지를 중점에 두고 작성하는지 궁굼합니다.. 저는 이강의를 보고 어플리케이션을 간단하게 작성하고있는데 Postman으로 하던 테스트를 Controller 테스트를 작성해서 통합테스트라고 하나요?? 그런식으로 작성하고있습니다. 무조건 mocking을해서 테스트를 작성하는게 올바른 방향인가요?? 단위테스트에 단위를 어떻게보면 좋을지 질문드려용,,, 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
빈 스코프 강의에서 '웹 관련 스코프(request, session, application)'의 사용에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 빈 스코프 강의 02:20분 부터 '웹 관련 스코프'에 대해 설명하는 영상을 볼 수 있었습니다. request, session, application 각 스코프의 특징에 대해서 알게 되었지만 application 스코프의 실제 사용 방식에 질문하고자 글을 작성해 봅니다. request, session 스코프의 사용은 각각 요청과 응답, 로그인 상태 확인 등에 사용하는 것은 이전 MVC 강의와 현업에서의 코딩 등을 통해 알게 되었습니다. 다만, application 스코프에 대해서는 현업에서도 다루는 코드를 볼 수가 없어 자세히 언제 사용하는지 궁금증이 생기게 되었는데요. 아래 제가 생각하는 기능 구현(설계)시 application 스코프를 사용하는 것이 맞는지 첨언 부탁드립니다. =============================================== [기능 구현(설계)] 요구사항: 홈페이지를 개발하되, 홈페이지의 기본정보(홈페이지명, 고객센터 번호, 소재지, 서비스 이용약관 등)는 '관리자 페이지 > 사이트 기본환경설정' 메뉴를 통해 관리할 수 있게 한다. 구현(설계): 1. 데이터베이스(MySQL, Oracle 등)에서 '홈페이지 기본정보'와 관련된 테이블 설계 2. CRUD 프로그래밍 ㄴ 여기서 '홈페이지 기본정보'를 Read할 때에는 application 스코프에 그 정보를 담아둬서 모든 사용자들이 동일한 정보를 볼 수 있게 함. ** application 스코프에 담는 이유는? 애플리케이션이 종료되기 전까지 딱 한번 자료를 로딩시켜 놓으면 다음부터는 조회할 필요가 없기 때문. ** 우려되는 사항은? 혹시 application 스코프를 사용하는 것이 메모리 부담을 증진시키는지와 만약 '홈페이지 기본정보'가 수정되는 경우 기존에 application 스코프에 등록된 데이터는 어떻게 처리할 것인지...
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Attributeconverter @Converter와 nativeQuery와 함께 사용했을때 @Converter가 작동하지 않습니다. 답변해주시면 큰절올리겠습니다,,,,,
1. 강의 내용과 관련된 질문인가요? 아닙니다. 그래도 답변 해주시면 너무 너무 감사드리겠습니다. 2. 네!! 어디에서도 찾지 못했습니다. 3. 넵! 지금 현제 하고 있는 프로젝트에서 Entity에 enum 필드를 @Enumerated를 사용하지 않고 컨버팅해서 사용하려고 했습니다. 예를 들자면 남자(1) 여자(2) 과같은 enum이 있을때 db에 저장할때는 1과 2 (코드값)을 넣고 select로 값을 가져올때는 남자,여자 이렇게 문자열로가지고 오고싶었고 그 방법으로 @Converter 를 사용하는것이였습니다. @Converter는 jpa에서 제공하는 findbyId() 와같은 함수에서는 잘 작동했지만 jpql을 사용해서 db에 직접 쿼리를 날릴때는 전혀 작동하지 않는 문제가 있었습니다. 디버깅 해봤을때는 jpql을 호출할때 내부적으로 @Converter의 프록시가 호출이 안돼서 아에 Attributeconverter의 구현클래스(컨버터)조차 호출이 되지 않았습니다. 저 혼자 해결해 보려했으나 도저히 해결이 안되고 물어볼 곳이 없어서 이렇게 글을 올리게 됐습니다. 답변부탁드립니다.
-
미해결
gradle build 중 complieJava 멈춤현상
안녕하세요. ec2 로 인스턴스를 생성 후 git 에 있는 springboot 기반의 프로젝트를 clone 후 .jar 로 배포를 시키려던 참이였습니다. ec2에는 openjdk11, mysql-server, git 설치 후 clone을 진행하고, 프로젝트 내부에 gradlew 파일에 chmod로 777 권한을 주고 build 를 진행시켰습니다. 보통 전에 하던 프로젝트는 빌드시간이 1분채 걸리지 않았는데, build 중에 complieJava 에서 지금 45분째 넘어가지 않고, 서버가 멈춘듯 합니다. 어떤 문제를 살펴봐야 할까요?
-
미해결Kotlin으로 개발하는 Spring Boot Web MVC
build() 는 무엇인가요?
안녕하세요. 강의 잘 듣고 있습니다. 스프링 부터를 잘 모르다보니 질문이 생기네요.혹시 중간에 작성하셨던 return ResponseEntity.status(200).build<Any>() 여기서 build()는 어떤 동작인가요?
-
미해결스프링 시큐리티
본인글 삭제 아래 질문 이어서..
안녕하세요. 댓글로 다시 질문드렸는데 못보시는것 같아서 한번 더 질문드립니다. 인증을 받은 상태라서 로그인 유저 정보를 가져오는데는 어려움이 없습니다. 그럼 작성한 게시글의 작성자 id는 어떻게 가져오는가가 문제입니다. @PreAuthorize("isAuthenticated() and (( #board.createdBy == principal.userId ) or hasRole('ROLE_ADMIN'))") @RequestMapping( value = "/{id}", method = RequestMethod.PUT) public ResponseEntity<Message> updateUser(Board board, @Pathvariable String id){ messageService.updateMessage(id); return new ResponseEntity<Message>( new Message("수정성공"), HttpStatus.OK ); } 구글링을 해보니 바디에 삭제 혹은 수정할 글의 정보를 담아서 위 코드와 같이 요청을 보내더라구요.. 그럼 의미가 없는게 아닌가 싶습니다. 해당 글쓴이의 id(pk)를 제 id와 같게 담아서 보내면 삭제할수 있는 권한만 있으면 다른 글도 삭제 혹은 수정이 되지 않는가? 라는 생각이 들더라구요.. 제가 이상하게 생각하는건가요??ㅎㅎ;;