inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

엔티티로 승격되지 않은 테이블은 JPA에서 어떻게 사용할 수 있나요?

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

JPA 강의 도중에 "모든 테이블을 엔티티로 바를 순 없다"고 얘기하셨던 게 기억나요. 어떤 강의였는 지 정확히 기억이 나진 않습니다. 엔티티 코드로 명시되지 않은 테이블은 어떻게 사용할 수 있는지 궁금합니다. JPA Native 쿼리로 써야하나요? 아니면 값 타입으로 정의를 해야할까요? 예를 들면, 특정 년도의 통계를 저장하는 테이블을 말할 수 있을 것 같아요. Member, Order, Delivery, OrderItem, Item 같은 테이블이 아니라 단순히 값만 뽑아서, 화면에 뿌리는 용도로 사용되는 테이블이요. 이런 테이블 같은 경우, 컬럼이 수십개가 넘어서, 이 컬럼들을 전부 Attribute로 정의해서 엔티티로 만들어야 하는지 의구심이 생깁니다. 또 이런 테이블은 용도상 객체 내부에서 이뤄질 연산이 거의 없기도 합니다.

  • java
  • JPA
Roy 댓글 1 좋아요 0 조회수 176

N+1 문제를 맞게 이해한 것인지 잘 모르겠습니다.

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이번 강의를 통해 공부하면서 N+1문제를 아래와 같이 이해하였습니다. ex) 모든 주문 내역을 가져오는 경우 -> 실제로 나가는 쿼리는 select * from orders 쿼리 한방이지만, 1) 이때 지연로딩인 경우 , 조회한 order에 대해 member나 delivery를 필요로 하는 경우에 각 order별로 member나 delivery 조회 쿼리가 N번씩 나가게 되고 2) 즉시 로딩인 경우, select * from orders 라는 모든 주문 조회 쿼리 한방이 나간 후, 곧바로 조회한 order들과 연과된 member와 delivery 조회 쿼리가 이어서 나가게 된다. (단 이떄 예측할 수 없는 쿼리가 나갈 수 있음.) 즉 정리하면 즉시로딩과 지연로딩 모두 N+1 문제가 발생할 수 있지만, 즉시로딩은 예측할 수 없는 쿼리가 나갈 수도 있어 최적화 시키기 어려운 반면, 지연 로딩은 페치 조인을 사용하여 order를 조회하면서 동일 쿼리 상에서 member나 delivery도 함께 가져오게 하는방법으로 최적화 시킬 수 있으니, 지연로딩을 사용하는것이 옳다. 라고 이해하였는데, 맞게 이해한 것인지 잘 모르겠습니다. 감사합니다.

  • spring
  • java
  • spring-boot
  • JPA
요니 댓글 1 좋아요 3 조회수 667

cat repository에서의 오류

미해결

탄탄한 백엔드 NestJS, 기초부터 심화까지

async existsByEmail ( email : string ): Promise < boolean > { try { const result = await this . catModel . exists ({ email }); return result ; } catch ( error ) { throw new HttpException ( 'db error' , 400 ); } } 에서 return result부분에서 오류가 발생합니다. src/cats/cats.repository.ts:20:7 - error TS2322: Type 'Pick<Document<Cat, any, any>, "_id">' is not assignable to type 'boolean'. 20 return result; ~~~~~~~~~~~~~~ exists() 따라가 보면 리턴타입이 boolean이 아닌거 같은데 어떤 부분을 확인해 보면 좋을까요? console.log로 result를 찍어보면 { _id: new ObjectId~~~} 가 나옵니다.

  • mongodb
  • express
  • nodejs
  • ssr
  • NestJS
댓글 1 좋아요 0 조회수 587

안녕하세요 질문이 있습니다!

미해결

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

안녕하세요~ 질문이있는데용 OPEN 키워드를 사용하지않고 사진의 코드를 실행시키면 값이 300으로 나오게되는데요~ Derived(300) 으로 부모가 호출이되고 자식의 프로퍼티가( override )가 아니기 때문에 부모의 초기화블록이 실행되면서 자식의 초기화되지 않는 init 블럭에 접근하지 않고 부모의 init에서 처리하기 때문에 300이 재대로 출력되는건가요?

  • oop
  • kotlin
  • java
woojin126 댓글 1 좋아요 1 조회수 315

리턴 값을 받지못함.

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

이렇게 계속 못잡아주고있습니다 이럴 때는 어떻게 해결해야하나요 ㅜ

  • MVC
  • spring
  • java
  • spring-boot
댓글 1 좋아요 0 조회수 261

제로초님 질문드리고싶습니다. 이런문제는 왜발생한건지 파일 캡쳐합니다 도저히 이해가 안돼네요 undefined property verify

미해결

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

import { Injectable , ExecutionContext , HttpException , HttpStatus , } from '@nestjs/common' ; import { AuthGuard } from '@nestjs/passport' ; import { JwtService } from '@nestjs/jwt' ; @ Injectable () export class JwtAuthGuard extends AuthGuard ( 'jwt' ) { constructor ( private readonly jwtService : JwtService , // @Inject(forwardRef(() => AdminsService)) // private readonly adminsService: AdminsService, ) { super (); } canActivate ( context : ExecutionContext ) { const request = context . switchToHttp (). getRequest (); const { authorization } = request . headers ; if ( authorization === undefined ) { throw new HttpException ( 'Token 전송 안됨' , HttpStatus . UNAUTHORIZED ); } //const token = authorization.replace('Bearer ', authorization); const token = authorization . replace ( 'Bearer ' , '' ); //console.log(token, 'token!!!'); request . user = this . validateToken ( token ); return true ; } validateToken ( token : string ) { const secretKey = process . env . SECRET ? process . env . SECRET : 'dev' ; try { const data = this . jwtService . verify ( token , { secret : secretKey , }); console . log ( data , '11번가데이터' ); return data ; } catch ( e ) { switch ( e . message ) { // 토큰에 대한 오류를 판단합니다. case 'INVALID_TOKEN' : case 'TOKEN_IS_ARRAY' : case 'NO_USER' : throw new HttpException ( '유효하지 않은 토큰입니다.' , 401 ); case 'EXPIRED_TOKEN' : throw new HttpException ( '토큰이 만료되었습니다.' , 410 ); default : console . trace ( e ); // console.log('광섭짱과 함께하는 코딩공부',) throw new HttpException ( '서버 오류입니다.' , 500 ); } } } } 이부분은 jwt.guard.ts 입니다 저 빨간줄에서 Trace: TypeError: Cannot read properties of undefined (reading 'verify') 이렇게 나오는데 왜 저렇게 나오는건지 도저히 모르겠네요 해당 토큰값도 잘 받아와서 verify 를 이용해 토큰 유효성 검사를 진행하려하는데 그부분에서 에러가 계속 납니다... 도와주세요

  • nodejs
  • express
  • NestJS
  • TypeORM
crud찍어내기 댓글 3 좋아요 0 조회수 1149

3분 59초에 말씀하신 부분에 대해 궁금한 사항이 있습니다

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요. 스프링 입문강의 [ 회원 도메인과 리포지토리 만들기 ] 강의에서 3분59초에 나오는 실무에서는 공유되는 데이터에 대해 컨커런시브를 사용한다?? 이 부분에서 컨터런시브?? 이거에 대해 좀 자세히 알 수 있을까요??

  • springboot
  • java
  • spring-boot
  • MVC
  • spring
  • java
준준 댓글 1 좋아요 0 조회수 247

useMemo와 useEffect 차이

미해결

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

useMemo 강의 잘 듣고 있습니다. 그런데, useMemo(() => { //생략 }, [data.length]); 한 것과 useEffect(() => { //생략 }, [data.length]); 한 것과 차이가 있을까요? 제가 생각했을때는 둘이 같이 작동할 것 같은데.. 어떻나요?

  • nodejs
  • javascript
  • react
예승재 댓글 2 좋아요 1 조회수 856

dataId = useRef(0) 질문입니다.

미해결

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

const dataId = useRef(0) 질문입니다. 강의 들을 때는 그냥 음~ 하면서 들었는데 나중에 생각해보니.. 왜 useRef를 쓰는 건지 잘 모르겠습니다. 그냥 const [dataId, setDataId] = useState(0); 해도 문제 없을 것 같은데.. 어떨까요??

  • javascript
  • nodejs
  • react
예승재 댓글 1 좋아요 0 조회수 465

while문 하나만 사용해서 문제를 풀었는데 길이 계산 식이 왜 이렇게 되는지 궁금합니다.

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

import java.util.Scanner; class Main { public int solution(int n, int k, int[] arr) { int answer = 0, lt = 0, rt = 0, kr = k; while (rt < n) { if (arr[rt] == 0) { if (kr > 0) { kr--; rt++; } else { if (arr[lt] == 0) { kr++; lt++; } else lt++; } } else { rt++; } if (answer < rt-lt) answer = rt-lt; } return answer; } public static void main(String[] args) { Main T = new Main(); Scanner kb = new Scanner(System.in); int n = kb.nextInt(); int k = kb.nextInt(); int[] arr = new int[n]; for (int i = 0 ; i < n; i ++) arr[i] = kb.nextInt(); System.out.println(T.solution(n, k, arr)); } } 강사님이 풀은 방식과는 동일하게 작동하는 것일텐데 rt 와 lt 길이 계산이 rt-lt+1 이 아닌 rt-lt 로 해줘야 맞는 결과가 나오네요 왜 이런 것인가요?

  • 코테 준비 같이 해요!
  • java
댓글 1 좋아요 0 조회수 395

Batch Size에서 두 번째 Order의 ID가 IN 쿼리에 들어가는 이유

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 처음 OrderItem을 조회할 때 두 번째 Order 의 ID(11)와 함께 IN 쿼리를 통해 조회됩니다. 여기서 IN 쿼리에 두 번째 Order 의 ID가 들어가는 이유에 대해 생각해보았습니다. 1. 현재 Order 엔티티를 통해 OrderItem을 조회하고 있다. 2. batch가 설정되어 있기 떄문에 1차 캐시에 들어있는 Order 들을 통해 최대 batch_size개 까지 IN 쿼리를 통해 조회한다. 3. 조회 대상이 된 1차 캐시에 들어있던 Order들 중에 두 번째 Order 가 포함되어있었기 때문에 IN 쿼리에 두 번째 Order 의 ID가 함께 들어갔다. 4. member와 delivery를 fetch하지 않았을 때도 위와 같은 이유로 한번에 조회되었다. 이런 과정을 거쳐서 같이 조회가 되지 않았나 생각해보았습니다. 제가 생각한 이유가 맞거나 혹시 틀린 부분이 있는지 궁금합니다. 감사합니다.

  • JPA
  • spring-boot
  • java
  • spring
안재우 댓글 1 좋아요 2 조회수 407

프로젝트 열 때, build.gradle 을 생성하는 이유

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요, 먼저 수업 정말 잘 듣고 있습니다 :) https://www.inflearn.com/questions/394903 저도 비슷한 에러를 겪었는데 (저는 빌드는 되는데 sonarlint 라고 코드 에러를 리뷰해주는 프로그램에서 비슷한 warning 메시지를 주었습니다) 조언해주신 대로 프로젝트를 열 때 build.gradle 을 열어서 해결했습니다. 저는 프로젝트 작업을 할 때, recent project 로 주로 꺼내오는(?) 편인데요 (혹은 인텔리제이를 닫지 않고 계속 작업하기도 합니다) 프로젝트를 가져올 때, build.gradle을 open 하는 것과, open 프로젝트 폴더 이름 혹은 open recent project 하는 것의 차이가 있는지 궁금합니다.

  • MVC
  • spring
  • java
  • spring-boot
jkdev1324 댓글 1 좋아요 0 조회수 910

h2연결

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

(사진)

  • java
  • MVC
  • spring-boot
  • spring
댓글 1 좋아요 0 조회수 483

faker2를 통해 blog. comment 생성 시도시의 오류

미해결

mongoDB 기초부터 실무까지(feat. Node.js)

Error: Blog validation failed: comments.blog: Path `comments.blog` is required., comments.user: Path `comments.user` is required., comments.content: Path `comments.content` is required. at ValidationError.inspect (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/error/validation.js:48:26) at formatValue (node:internal/util/inspect:782:19) at inspect (node:internal/util/inspect:347:10) at formatWithOptionsInternal (node:internal/util/inspect:2167:40) at formatWithOptions (node:internal/util/inspect:2029:10) at console.value (node:internal/console/constructor:324:14) at console.log (node:internal/console/constructor:360:61) at /Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/src/routes/blogRoute.js:26:13 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { errors: { 'comments.blog': ValidatorError: Path `comments.blog` is required. at validate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1330:13) at SchemaType.doValidate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1314:7) at /Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/document.js:2762:18 at process.processTicksAndRejections (node:internal/process/task_queues:77:11) { properties: [Object], kind: 'required', path: 'comments.blog', value: undefined, reason: undefined, [Symbol(mongoose:validatorError)]: true }, 'comments.user': ValidatorError: Path `comments.user` is required. at validate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1330:13) at SchemaType.doValidate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1314:7) at /Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/document.js:2762:18 at process.processTicksAndRejections (node:internal/process/task_queues:77:11) { properties: [Object], kind: 'required', path: 'comments.user', value: undefined, reason: undefined, [Symbol(mongoose:validatorError)]: true }, 'comments.content': ValidatorError: Path `comments.content` is required. at validate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1330:13) at SchemaType.doValidate (/Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/schematype.js:1314:7) at /Users/yungsu2391naver.com/Desktop/mongodb_nodejs tutorial/inflearn_nodejs-mongodb/node_modules/mongoose/lib/document.js:2762:18 at process.processTicksAndRejections (node:internal/process/task_queues:77:11) { properties: [Object], kind: 'required', path: 'comments.content', value: undefined, reason: undefined, [Symbol(mongoose:validatorError)]: true } }, _message: 'Blog validation failed' }

  • nodejs
  • javascript
  • error
  • aws
  • rest-api
  • nodejs
  • DBMS/RDBMS
  • mongodb
  • 데이터 엔지니어링
고용수 댓글 1 좋아요 0 조회수 267

에러

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

안녕하세요. Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-06-29 21:39:03.114 ERROR 10435 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : 라는 문구가 콘솔창에 뜨며 안됩니다.. 왜 그런 것인가요..?ㅜ 인텔리제이로 하고있습니다.

  • 에러
  • MVC
  • spring-boot
  • spring
  • java
댓글 1 좋아요 0 조회수 342

프록시를 이용한 연관관계 설정 시 잘못된 id값을 받았을 경우에 대해 질문드립니다!

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

단순히 연관관계 설정을 위해 엔티티를 사용하는 경우, 프록시로 조회(em.getReference || Data JPA의 경우 getById()) 형태로 조회한다고 알고 있습니다. 연관관계 설정을 위해 필요한 값은 id뿐인데, 굳이 엔티티의 다른 필드 정보까지 조회하기 위한 쿼리를 날리지 않는 편이 좋으니까요. 이 점과 관련해서 동료들과 이야기를 나누던 중 얘기가 나왔었는데, - 위와 같은 방식으로 연관관계를 맺을 경우 id값이 잘못된 값일 때 문제가 발생한다. 는 이야기를 들었습니다. 제 생각에는 정확한 id값 전달의 경우 id값을 전송하는 쪽의 책임이고, 그런 일이 나올 경우에 대비하는 것에 비해 프록시를 이용해서 조회 쿼리를 한 번 절약하는 이득이 더 크다고 생각했습니다. 하지만 방어적 코드를 작성하는 편이 좋다라는 측면에서 동료들의 말에도 일리가 있어서 고민이 되었습니다. 현업에서도 프록시를 이용해 연관관계를 맺는 방식을 사용하실 것 같은데, 위 경우에 대해 어떤 방식으로 별도의 처리를 해주시는지, 이 문제에 대해 어떻게 생각하시는지 궁금합니다.

  • 프록시
  • 연관관계
  • JPA
  • java
이한빈 댓글 1 좋아요 0 조회수 244

postgresql 쿼리를 dsl 에서 사용시 질문 드립니다.

해결됨

실전! Querydsl

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] postgresql 쿼리문을 dsl 을 통해 사용하려 합니다. group by 를 사용하여 해당 기준에 따른 특정 컬럼의 데이터를 array_agg를 통해 받아오려면 어떻게 해야할까요?

  • postgresql
  • java
  • JPA
janhoy 댓글 1 좋아요 0 조회수 1011

[H2 DB] jpashop 접근 방법

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요. H2 ~/test DB는 접속이 가능하나, ~/jpahop으로 접근이 전혀 안되어 문의글 남깁니다. 사실, 문의글을 남기기 전, 구글링과 인프런 질의글 통해서 작업도 진행해보았지만 실패했습니다. 서포터즈분께서 2개의 링크를 추천해주셨고 해당 내용도 사실 이미 봤던 내용이지만 놓친 것이 있을지 몰라 따라해보았습니다만 또 실패했습니다. ㅠ.. 그래서 결국 재 문의를 남깁니다. 저의 핵심 은 ~/test 로는 로그인이 가능 하나, ~/jpashop으로 접근하게 되면 아래와 같이 오류가 발생 합니다. 강의보니까 persistence.xml에 아래와 같이 설정하고 나서 H2 접속해서 해당 url로 연결하면 jpashop DB로 접속하던데 저는 계속 에러가 발생하네요. <property name ="javax.persistence.jdbc.url" value ="jdbc:h2:tcp://localhost/~/jpashop" /> 이 사진은 서포터즈 분께서 남겨주신 링크 적용한 pom.xml 입니다. 결국 이 방법도 통하지 않았습니다..

  • java
  • JPA
Adol 댓글 2 좋아요 1 조회수 1887

hello.html에서 ${data} 빨간줄

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요. 강의 정말 잘 듣고있습니다! 다름이 아니라 아..마..도? devtools dependency를 추가해주고 난 다음 발생한 것 같은데 hello.html에서 ${data} 빨간줄이 그어져 있네요. 마우스로 갖다 대보니 cannot resolve 'data'라는 문구가 뜨지만 실행 시키면 콘솔 창에 별다른 오류도 없고 devtools 등 전부 정상 작동 합니다. 어떤 것 때문에 그런것일까요??

  • spring
  • JPA
  • 웹앱
  • java
  • spring-boot
김동현 댓글 1 좋아요 0 조회수 427

OrderService에서 itemService ItemRepository를 주입하는 것에 대해서 질문이 있습니다.

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 김영한 멘토님 덕분에 스프링에 대해서 쉽게 공부할 수 있어서 항상 감사함을 느끼고 있습니다. 멘토님의 강의를 복습하던 중 궁금한 것이 생겨서 질문 남깁니다. 제가 의구심을 가지는 코드 부분은 다음과 같습니다. @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final MemberRepository memberRepository; private final OrderRepository orderRepository; private final ItemRepository itemRepository; /** 주문 */ @Transactional public Long order(Long memberId, Long itemId, int count) { //엔티티 조회 Member member = memberRepository.findOne(memberId); Item item = itemRepository.findOne(itemId); .... } .... } @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class ItemService { private final ItemRepository itemRepository; .... public Item findOne(Long itemId) { return itemRepository.findOne(itemId); } } @Repository @RequiredArgsConstructor public class ItemRepository { .... public Item findOne(Long id) { return em.find(Item.class, id); } } 여기서 제가 궁금한 점은 OrderService에서 ItemService 대신 itemRepository를 주입한 이유가 궁금합니다! 물론, 둘 다 실행은 동일하게 되지만, itemRepository를 ItemService에서만 접근하게 하고, 타 클래스에서 item에 관한 로직은 무조건 ItemService으로만 접근하는 식으로 해야 item에 관련된 로직들이 응집도가 높아지고, 모듈 간 결합도가 낮아지지 않을까요?? 멘토님의 의견이 궁급합니다!

  • spring
  • 웹앱
  • java
  • spring-boot
  • JPA
pado 댓글 1 좋아요 0 조회수 242

인기 태그

인프런 TOP Writers

주간 인기글