묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
SpringConfig파일 dataSource 밑줄 오류
안녕하세요 강사님 강의 잘 듣고 있습니다. 아래 사진처럼 밑줄 오류가 뜨는데 실행해보니 별 이상은 없습니다. 정확인 무슨 이유인지 알 수 있을까요? 이것 뿐만 아니라 tymeleaf의 model 데이터 인식 오류로 인해 model 데이터에도 밑줄 오류가 뜨네요 인텔리제이가 약간 이런 오류가 많나봐요 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
AppConfig, ApplicationContext 에 대한 질문
안녕하세요 강사님, 몇가지 질문 드리겠습니다. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ- 질문 1. 제가 지금까지의 흐름을 맞게 이해하였는지 궁금합니다. 이전까지의 강의에서는(@ComponentScan 등장 전) AppConfig에서 @Configuration을 달았고, @Configuration에 의해 그 밑에 있던 @Bean들을 조회하여 빈을 생성하고 등록하는 방식으로 진행이 됐습니다. 테스트 코드에서 ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);위 코드를 통해서 AppConfig의 빈이 등록될 수 있었고 거기에서 @Configuration을 인식하여 그 안에 있는 @Bean들을 모두 인식해 필요한 빈들을 등록하였습니다. 결론적으로, 지금까지는 어떠한 컴포넌트 스캔도 이뤄지지 않았으며 모든 빈 등록은 new Annotation~~Context(AppConfig.class)에 의해 생성된 AppConfig 빈에 의해 이루어졌습니다. 제가 맞게 이해한건가요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 질문 2. @ComponentScan을 사용한다면 ApplicationContext 가 굳이 필요없지 않나 하는 생각이 듭니다. AppConfig와 @Configuration을 통해 수동으로 빈을 등록한다 하더라도.. 컴포넌트 스캔의 범위에 AppConfig를 두면 알아서 모든 빈들이 문제없이 생성될 것입니다.(굳이 new Annotation~~Context(AppConfig.class) 를 통해 AppConfig 빈을 등록하지 알아도 알아서 스캔되어 등록될 테니까) @Component, @Autowired를 통해 의존성 주입을 해결해도 컴포넌트 스캔의 범위만 잘 설정해준다면 모든 빈들은 문제없이 생성되고 주입될 것입니다. 그렇다면 실제 프로그래밍에서는 ApplicationContext는 쓰이지 않는다고 봐도 되나요? 아니면 강의에서 해오셨던 것처럼 테스트 코드에서 getBean을 사용하기 위해서만 사용된다고 보면 될까요? 그것도 아니면 실제 프로그래밍에서도 사용되는 어떠한 용도가 있을까요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ질문 3. 다른 질문에서 지금까지 CoreApplication을 전혀 사용하지 않았기 때문에 CoreApplication 없이 프로젝트를 돌려도 똑같이 돌아갈 것이라고 말씀하셨는데요. CoreApplication에 대한 직접적인 사용은 없었지만 CoreApplication에 @SpringBootApplication이 있고 그 안에 @ComponentScan이 있고CoreApplication은 hello.core 하위에 존재하니까 hello.core 하위의 패키지를 모두 컴포넌트 스캔 할 것이고.. 그럼 CoreApplication은 컴포넌트 스캔으로 프로젝트에 영향을 미치고 있던 게 아닌가요? 어떻게 이 중요한 녀석을 빼놓고도 똑같이 동작할 수 있는 것인가요? 이에 대한 해답으로 new Annotation~~Context(AppConfig.class)를 통해 모든 빈 등록을 했으니 CoreApplication의 @ComponentScan이 없어도 되는 것인가? 라는 생각이 드는데요. 만약 이게 맞다면 하나 더 궁금해지는 것이.. 이대로라면 빈 등록이 CoreApplication의 @ComponentScan에 의해 한 번, AppConfig의 @Configuration에 의해 또 한 번. 총 두 번의 빈 등록이 일어나는데 이것에 의한 에러가 발생하지 않는 이유가 무엇인가요? 이번 실습에서 이와 같은 오류를 막기 위해 @Configuration을 컴포넌스 스캔 범위에서 제외하는 코드를 따로 작성해줬던 것이 아니었나요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 질문 4. 이전 강의에서 스프링 컨테이너가 @Configuration을 통해 싱글톤을 가능하게 하는 방법을 설명해주셨는데요.(@Configuration이 동록된 클래스를 상속받아 AppConFIg@@@CGLIB으로 사용하는 방법) 만약 AppConfig와 @Configuration이 없이 @ComponentScan을 통해서만 빈 등록과 의존성 주입을 모두 처리할 경우에는 어떤 식으로 싱글톤을 유지할 수 있게 되나요? 혹시 이게 너무 지엽적인 부분이라면 "그냥 스프링 컨테이너가 알아서 잘 해준다." 정도로 받아들이고 넘어가도 괜찮을까요? ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 지식의 소용돌이가 아직 완벽히 정리되질 않아 질문이 너무 길고 횡설수설 합네요. 죄송합니다. 강의 재밌게 잘 듣고 있습니다. 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
강사님 스프링 컨테이너에 관한 질문이있습니다.
강의 내용을 복습하다가 막힌곳이 있는데 AppConfig 클래스에 Configuration 애노테이션이 있으니깐 결론적으로 스프링 컨테이너가 되고 그 이하의 Bean들을 관리해주는 건가요?? Configuration 애노테이션이 붙어있으면 붙어있는 클래스가 모두 스프링 컨테이너가 되는건가요??
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
junit으로 회원등록 API 테스트 코드를 만들어 보았습니다.
junit으로 회원 등록 API 테스트 코드를 만들어 보았습니다. @ExtendWith(SpringExtension.class)@SpringBootTest@AutoConfigureMockMvcclass MemberApiControllerTest { @Autowired MockMvc mockMvc; @Autowired ObjectMapper objectMapper;// @BeforeEach// void setUp(@Autowired MemberApiController memberApiController){// mockMvc = MockMvcBuilders.standaloneSetup(memberApiController).build();// } @Test @DisplayName("회원_등록API_V1") void 회원_등록ApiV1() throws Exception { //given MemberDto memberDto = new MemberDto("회원1"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v1/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Data @AllArgsConstructor static class MemberDto { private String name; } @Test @DisplayName("회원_등록API_V2") void 회원_등록ApiV2() throws Exception { //given MemberDto memberDto = new MemberDto("회원2"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")); } @Test @DisplayName("회원정보_업데이트V2") void 회원정보_업데이트V2() throws Exception { //given MemberDto memberDto = new MemberDto("회원3"); final String jsonStr = objectMapper.writeValueAsString(memberDto); //when final ResultActions resultActions = mockMvc.perform(post("/api/v2/members/1") .contentType(MediaType.APPLICATION_JSON) .content(jsonStr) ).andDo(print()); //then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.id").value("1")) .andExpect(jsonPath("$.name").value("회원3")); } } 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
싱글톤이 DIP를 위반한다는 점에서 질문있습니다.
안녕하세요. 수업을 듣다가 Singleton이 DIP를 위반한다는 점에서 여쭤보고 싶은 점이 생겼습니다. 클라이언트에서 의존성을 주입받는 다고 하고, A, B 두 클래스가 있을 때 B가 A를 상속받는 Singleton이라 가정하겠습니다. 클라이언트가 생성자 주입을 받든, Setter 주입을 받든 A에 의존하게 하고, 클라이언트에 의존성을 주입하는 Config(?)가 A를 넣는자리에 B를 넣어주면 DIP 문제가 해결되는 것이 아닌가요? 어째서 Singleton을 쓰면 DIP가 위반되는지 궁금합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Whitelabel Error Page
안녕하세요 강사님 강의보고 그대로 했는데 http://localhost:8080 에서 회원가입이나 회원목록을 누르면 Whitelabel Error Page 요런 에러가 나오는데 어디서 잘못된건지 찾아도 잘모르겠어서요.. 요 캡쳐화면으로 찾을수있는걸까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
~/test.mv.db 요파일 생성 여부는
안녕하세요 강사님 ~/test.mv.db 요파일 생성여부는 윈도우이용자는 어떻게 조회할수있는지 알수있을까요..??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 db 생성 에러
안녕하세요! [프로젝트 환경설정 - H2 데이터베이스 설치] 강의를 듣다가 질문이 생겨서 문의드립니다. 환경은 windows이고 강의 내용에 따라서 H2를 설치한 후 h2.bat을 실행해서 h2 콘솔을 열고 localhost로 바꾸고 jdbc:h2:tcp://localhost/~/jpashop가 아닌 jdbc:h2:~/jpashop 를 jdbc url에 입력하고 연결을 눌렀는데 db 설치 및 연결이 되지 않고 아래 첨부 사진과 같이 "Database "C:/Users/LG/jpashop" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149"라는 에러가 뜹니다. 혹시 몰라서 Generic H2 Server, Embedded 둘 다 해보고, h2를 여러번 껐다 켰다도 반복하며 계속 jdbc:h2:~/jpashop으로 생성을 하려는데 db가 존재하지 않다는 에러가 계속해서 뜹니다. 이런 경우에는 어떻게 해결해야하는지 구글링해도 jdbc:h2:~/test 이 방법밖에 나오지 않아 여쭙니다ㅠㅠ 감사합니다! Database "C:/Users/LG/jpashop" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 (도움말)org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/LG/jpashop" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.engine.Engine.openSession(Engine.java:71) at org.h2.engine.Engine.openSession(Engine.java:192) at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) at org.h2.engine.Engine.createSession(Engine.java:166) at org.h2.engine.Engine.createSession(Engine.java:29) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) at org.h2.Driver.connect(Driver.java:69) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:309) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:289) at org.h2.server.web.WebServer.getConnection(WebServer.java:785) at org.h2.server.web.WebApp.login(WebApp.java:1008) at org.h2.server.web.WebApp.process(WebApp.java:223) at org.h2.server.web.WebApp.processRequest(WebApp.java:173) at org.h2.server.web.WebThread.process(WebThread.java:139) at org.h2.server.web.WebThread.run(WebThread.java:94) at java.base/java.lang.Thread.run(Thread.java:832)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
findByName의 result를 List로 받는 이유가 있나요?
service 코드를 개발 할 때 중복 되는 member_name이 있는지 validate를 해줘서 결국 member_name이 unique 값이 될텐데 , getSingleResult를 이용하여 아래와 같이 작성하지 않는 이유가 있나요? public Member findByName(String name){ return em.createQuery("select m from Member m where m.name = :name",Member.class) .setParameter("name",name) .getSingleResult();}
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
질문 있습니다!!
안녕하십니까 강의 진짜 정말 유익하게 잘 듣고있는 졸업예정 취준생입니다. 컴퓨터공학이라는 전공의 수 많은 분야 앞에서 적성을 찾다가 최근에 웹개발로 마음을 굳혀서요.. 지금이라도 스프링을 배워보면서 포트폴리오용으로 CRUD 기능을 구현해보려고 하는데 바보같은 질문이지만 인정받으려면 html css javascript처럼 완전 기초의 언어가지고 만들어야 인정해주나요?.. 왜냐하면 지금 강의 앞부분만 들은 시점에서 스프링데이터 JPA가 CRUD기능도 다 제공을 해준다고 하더라구요... 그럼 구현 난이도도 그만큼 쉬워진다는건데 과연 스프링으로만 CRUD를 구현하는것과 프레임워크 없이 구현하는것과 회사 입장에서 많은 구분을 두는 편인가요?? 만약 그렇다면 JPA까지만 배운 상태로라도 CRUD를 구현해보려고 합니다.. 아예 이번 강의는 듣지 않은채로... (스프링 데이터 JPA를 귀에 담지 않은채로 라는 말입니다) 강의 정말 잘 듣고있습니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
데이터 베이스 파일 생성이 되지 않습니다.
안녕하세요? 강사님. 항상 강의 잘 듣고 있습니다. 다름이 아니라, 제가 window installer 로 다운받은후에 H2 콘솔을 열어서 , 여러방법을 사용해서 데이터 베이스 파일 생성을 해보려고 했는데 되지가 않습니다. 주소창에 localhost:8082 도 해보고 저장한 설정 에서 server 대신 embedded 도 해보고, JDBC URL 에서 ~/test로 변경도 해보고 다 해봤는데 계속 똑같이 아래와 같은 것만 뜨네요... Database "C:/Users/user/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149
-
해결됨스프링 웹 MVC
세션에서 넘어오는 데이터 바인딩
강의 3분 정도의 설명에 session 에 있는 데이터를 받아와 @ModelAttribute 의 객체에 바인딩이 가능하다고 하셔서, 테스트를 작성해봤지만 실패해 테스트를 어떻게 작성해야하는지 질문드립니다.. 제가 시도한 방법은 다음과 같습니다. <컨트롤러> @Controller public class TestController { @PostMapping("/session") @ResponseBody public Event sessionTest(@ModelAttribute Event event){ return event; } } <테스트 코드 > @WebMvcTest class TestControllerTest { @Autowired MockMvc mockMvc; @Test void sessionTest() throws Exception { MockHttpSession session = new MockHttpSession(); session.setAttribute("name", "jaden"); mockMvc.perform(post("/session") .session(session) .param("limit", "10")) .andDo(print()) .andExpect(status().isOk()); } } <실행결과> 세션을 목업해서 넘겨봤는데, 바인딩이 되지 않아 null 이 찍힙니다. 또한, 두번째로 시도한 방법은 mockMvc 에 .sessionAttr 을 넣을 수 있어서 사용해 봤습니다. <테스트코드> @Test void test2() throws Exception{ mockMvc.perform(post("/session") .sessionAttr("limit", "10") .param("name", "jaden")) .andDo(print()) .andExpect(status().isOk()); } <실행결과> 하지만 마찬가지로 바인딩이 잘 되지 않는 것 같더라구요.. 어떻게 테스트 코드를 작성해야 제대로 바인딩을 할 수 있을까요? --- 아니면 혹시, session 에서 값을 받아와 setter 를 통해 직접 바인딩 해줄 수 있기 때문에 그렇게 말씀하신걸까요? 좋은 강의 감사드립니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
8:00 getter/setter 윈도우 단축키는
alt+Insert 하면 getter and setter를 생성 할 수 있습니다,
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
cannot find symbol class Model 오류가 발생합니다
@Controller public class HelloController { @GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; } } 위를 복사하여 실행할때, cannot find symbol class Model라고 오류가 발생합니다!ㅠ
-
미해결스프링 핵심 원리 - 기본편
안녕하세요!! 영한님 향후 강의에 대한 질문이있습니다
안녕하세요 현재 1학기만 남은 졸업예정학생입니다 2개월뒤에 졸업작품으로 스프링부트로 웹사이트 개발예정이있습니다. 3학년때 스프링 ( jsp, oracle, mybatis) 으로 근본적인 이해없이 그냥 복붙으로 뚝딱뚝딱 사이트를 만들었던 경험이있는데 이번 졸업작품은 프론트단/백단 모두 혼자서 완벽히 이해하며 만들어 보는것을 목표로 하고있습니다. 제가 궁금한점은 1. 영한님의 스프링입문,기본 편 강의를 수강했고 현재 활용1편(야생형)까지 들은상태입니다. 스프링 기본편은 알려주시는것들이 너무 많은데 제가 제대로 소화하지 못하는것같아서 한번 듣기는 했지만 나중에 다시 꼭 들어야겠다고 생각하고있습니다. 제가 많이 부족한것인지는 몰라도 아직까지 선뜻 스프링부트로 사이트를 만들어 봐야지 하는 정도의 개념은 잡히지 않은것같습니다. 향후계획은 JPA기본편을 수강-> 활용1편 복습-> 그후 야생형 순서 로 가려고하는데 어느정도 강의를 듣고나서 시작해보시는걸 추천하시나요?? 2. 오픈예정인 실전MVC, db접근 등의 강의는 야생형 로드맵 까지 완료한후에 듣는것을 추천하시는건가요??? 당장 웹사이트를 만들어야하는 상황이면 JPA를 깊게 파는것보다 실전 MVC, DB 강의를 듣는것이 조금더 효율적일까요? 제가 생각하는것은 야생형 로드맵을 다 듣고나면 강의가 추가로 오픈될것같아서 그후에 듣고싶지만 빨리 여러강의를 수강하면 제가많이 부족한탓에 흡수를 못할것같아 걱정이됩니다 강의가 정말좋아서 처음으로 강사님의 모든 로드맵의 과정들을 전부듣는다는것을 전제하에 질문드리게되었습니다 ㅠㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Controller에서 Repository 접근
DDD 자료를 찾아보면 강의 자료와 같이 Domain이 전체 레이어를 아우르고, Controller에서 Repository를 접근 하도록 설계되어 있습니다.기초 강의에서는 Entity를 Controller에 넘기지 말라고 말씀 하셨고 그 이유도 충분히 이해 했었습니다. 지금 예제에서는 Controller가 Repository를 호출하게 된다면 Entity가 넘어가게 될텐데... 강의상 편의를 위해서 하신건가요? 실무에서도 빈번하게 사용하는 구조인가요? 추가적으로 DTO를 사용한다면, 아래 예제 계층에서 오고가는 DTO에 대한 표현(naming rule, suffix, package 등등)을 어떻게 하시는지 궁금합니다.- web <-> controller- service <-> repository
-
해결됨스프링 핵심 원리 - 기본편
클라이언트 코드란 뭘까요..?
정리하는 내용에서 클라이언트 코드라는 단어가 나오는데, 정확히 클라이언트란 무엇일까요..? client라는 단어가 사실 여기저기서 자주나오다 보니 헷갈립니다. 저는 프론트엔드 개발자라서 그런가 client 코드라고 하면, 브라우저에서 작동하는 프론트 코드가 떠올라서요.. 어떻게 이해를 하면 좋을까요? 소프트웨어 공학 관점에서 말하는 Actor, 특정 Actor(여기서는 주문을 하는 손님)에 대한 코드라고 보면 되는걸까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
단위테스트가 어떤 것인지 좀 더 구체적으로 설명 부탁드려도 될까요?
안녕하세요. 좋은 강의 항상 감사드립니다. 단위 테스트의 중요성을 강조해주셨는데 제가 아직 초보라서 잘 이해가 가지 않습니다. 제 수준으로 테스트를 이해한 것을 말씀드리자면, 만약 수량이 2개가 추가되면, 그것이 데이타베이스에 2개가 추가 됐는지를 확인하고, 그것이 화면으로 제대로 출력되는 것을 확인하는 것이 가장 최소한의 테스트라고 생각하기 때문입니다. 그런데 DB를 거치지 않고 한다는 것이 어떤 의미인지 사실 잘 모르겠습니다. 지금 in memory를 DB로서 사용하고 있는데, 이것조차 사용하지 않게 되는건가요? 혹시 가능하시다면 지금의 예제에서 단위테스트를 한다면 예시를 짧게라도 한 줄 부탁드려도 될까요? 그런 측면에서 제가 테스트에 대하여 이해도가 너무 낮은 것이 아닌가 싶습니다. junit이란 것도 선생님 수업 들으면서 이번에 처음 알게 됐거든요. 그래서 혹시 가능하다면 테스트와 관련하여 참고할만한 책이나 자료가 있으면 추천 부탁드려도 될까요? 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
강의를듣다보니 궁금증이생겼습니다
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 으로하셨는대 ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 이렇게 하지 않으신 이유가 궁금합니다 이전까지는 이방법으로 했기때문에 궁금해졌습니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
비지니스 로직구현 Entity VS Service
안녕하세요 강사님! 이번 강의에서는 Item.class에 다음과 같이 해당 변수에 대한 접근은 해당 entity에서 작성하여 주셨는데요, /* * 재고 수량 증가 */public void addStock(int quantity){ this.stockQuantity += quantity;}/*재고 수량 감소 */public void removeStock(int quantity){ int restStock = this.stockQuantity - quantity; if(restStock < 0){ throw new NotEnoughStockException("need more stock"); } this.stockQuantity = restStock;} 1. 그렇다면 만약 회원의 주소를 변경하는 로직을 만든다고 하면 이 또한 memberRepository.class가 아닌 member.class에서 변경하여 주는 것이 맞을까요?? 2. 또 비슷한 맥락으로 service 구현과 entity에서의 로직 구현의 차이는 객체의 맴버변수에 접근하는지/ 맴버 자체에 접근하는지의 차이로 이해하면 될까요?? 감사합니다^^!