이야기를 나눠요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
스프링 핵심 원리 - 기본편
여러분은 어떤 깨달음이 있으셨나요?
< 노트 >깨달음:주문 서비스를 하나 둔다=> 주문 생성 서비스 제공하고=> 결과로 주문 결과를 반영=> 주문 결과에는 회원 등급 별 할인 정책에 의한 가격이 들어감==> 회원 등급 조회하기 위한 회원 서비스==> 할인 정책 적용하기 위한 할인 정책 서비스가 필요함할인 정책이 하나의 역할이 될 수 있다=> 구현은 정액, 정률.협력 관계: 역할을 통한 체계=> 재사용: 구현 바꿔서 체계 세부 내용을 바꿀 수 있다
-
스프링 핵심 원리 - 기본편
한번 정리해보았어요! 어떠신가요?
[리뷰]클래스 다이어그램=> 정적객체 다이어그램=> 동적[JUNIT]배운점:- 사용시 given, when, then 적기검증:- org.assertj.core.api 쓰기이제 테스트:- 눈으로 검증 하는 테스트 => 테스트 코드를 통한 검증[DIP]DIP 위반:=> 한개의 클래스 내에서 인터페이스와 구현체 두가지를 의존함
-
스프링 핵심 원리 - 기본편
배운점 어떤가요?
< 느낌점 >- 동시성 이슈가 있을때?=> Concurrent Hashmap 사용!- 구현체 하나 있을때?=> 이름 뒤 Impl 이라고 많이 쓰임!
-
스프링 핵심 원리 - 기본편
클래스 다이어그램에 추가적으로 객체 다이어그램이 필요하군요
아래 처럼 이해했는데 맞을까요? < 클래스 그림>=> 점선: 상속, 실선: 뭔가 사용하는 인터페이스?- 회원 서비스에 하나의 인터페이스 MemberService- 이것의 구현체 MemberServiceImpl 이 있다- 회원 저장소에 대한 인터페이스 MemberRepository 를 두고- MemberServiceImpl 은 인터페이스 MemberRepository 를 조작 < 객체 그림>=> "new 한 인스턴스 끼리의 참조"- 어떤 MemberRepository 를 쓸지를 나타냄=> 회원 서비스 (impl) 은 메모리 회원 저장소 사용 (MemoryMemberRepository)
-
스프링 핵심 원리 - 기본편
다음 강의 듣기 전 설계해봤어요. 어떤 점을 개선해야 할까요?
설계:< 미확정 부분에 대한 설계 >회원역할: DB 클래스를 추상화구현: 자체 DB인지 외부 시스템 인지에 따라 달라짐 주문과 할인 정책역할: 할인 정책구현: VIP의 할인 정책, 나중에 정할 할인 정책감사드립니다.
-
스프링 핵심 원리 - 기본편
강의 정리 해보았는데요. 어떤가요?
깨달음- OCP, DIP를 지키면 => 스프링 프레임워크를 만들게 됨정리- 설계 핵심: 역할과 구현 분리-- 모든 설계에 인터페이스를 부여하자--- 추상화란 비용 => 장점 보다 단점이 클 때---- 변화 할 것 같다 => 인터페이스. 안변한다 => 구현클래스.
-
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
앱 개발 프로젝트에 대한 고민이 있습니다.
앱 개발 프로젝트로 flutter랑 백엔드 spring 연동해서 앱을 만들고 싶은데, 어디 정도 까진 들어야 하거나 또는 어디 부분을 들어야, 조금 급하더라도 프로젝트를 진행할 때 응용을 할 수 있을까요? (로드맵 mvc 1편까지는 완강했습니다.)
-
스프링 핵심 원리 - 기본편
강의 자료에 사용하시는 그림
안녕하세요! 강의 자료에 사용하시는 그림 만드실 때 따로 사용하시는 도구가 있는지 궁금합니다.
-
스프링 핵심 원리 - 기본편
이해 잘한 것일까요?
SRP 단일 책임 원칙- 하나의 책임이라는 것은 모호하다.=> 문맥과 상황에 따라 다르다==> 책임을 잘 조절하는 것이 묘미- 기준이란 것은 변경=> 변경이 있을 때 파급 효과가 적도록OCP 개방-폐쇄 원칙- 확장: O, 변경: X=> 별도의 뭔가가 필요하다- 핵심: 별도의 뭔가 - 스프링 컨테이너LSP 리스코프 치환 원칙- 핵심: 인터페이스 규약을 맞춰야 한다ISP 인터페이스 분리 원칙- 핵심: 인터페이스는 잘게 나눠라=> 물론 이것도 너무 잘게 말고. 잘 조절하는 것이 묘미DIP 의존관계 역전 원칙- 핵심: (역할) 기능은 인터페이스의 역할 안에서 모두 설명되어야 한다.=> 클라이언트는 (구현) 을 모르고 (역할) 만 가지고 해야 한다.==> 근데, 다형성을 쓰더라도 parent = child 를 대입하여, child 에 의존한다.- 어떻게 해야 해?=> spring
-
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
검증 관련해서 질문드립니다.
안녕하세요 . 검증관련 질문드립니다! 폼에서 올바른 데이터가 들어오지 않으면, 컨트롤러에서 Bean Validation을 동작시켜 에러를 타임리프에 넘기어 사용자에게 보여주는 부분에서,만약에 템플릿 엔진으로 타임리프를 사용하지 않고, 뷰를 리액트나 다른 프론트앤드 기술로 사용한다면 어떤식으로 이용 할 수 있을까요..?타임리프에서만 특화된 기능인가요 ??
-
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
V3부터 내용이 어려워 지는거 같은데
다음 내용인 스프링 mvc내용을 이해 하려면 다시 복습을 하고 넘어가는것이 좋은지 아니면 일단 이해하지 못한상태로 넘어가서 다음 내용을 습득하는것이 좋은지 고민입니다.지금 내용을 이해하지 못하면 다음 내용(웹 mvc2탄)을하나도 이해할 수 없나요?그리고 지금 내용은 다음 강의인 웹 mvc 2탄에서 사용하지 않는 내용인가요?
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실제 개발할 때의 마음가짐에 대해 질문드립니다.
Q. 실제 개발시에는 메서드가 하나 추가될 때마다 테스트해줘야 하는 것 맞을까요?강의 상에서는 Order, OrderItem 코드 작성하시는 순서가 되게 유기적으로 매끄럽게 구성되어있는데요. 실제 코드 작성할 때는 실수도 나올 수 있고, 특정 메서드에 어느 클래스에 위치해야하는 게 좋을지에 대한 고민같은 것이 동반될 것 같다는 생각이 들 것 같다는 생각이 듭니다(실제로도 그래왔던 것 같구요).좋은 강의를 수강하다보니 새로운 상황을 혼자 맞이할 때 막막한 순간에 어떤 마음가짐을 가져야할 지 고민이 되어 질문드립니다.p.s) 지금은 열심히 완강을 향해 달려가고 있는 중이라 강의평을 남기지 못하고 있는데, 여유가 되면 감사 인사 꼭 드리도록 하겠습니다. 항상 고마워요 영햔님....
-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
질문드립니다
안녕하세요! 스프링 입문편 듣고 있습니다 들으면서 이해가 가는 부분도 있고 어렵게 느껴지는 부분들이 있는데 이해갈때까지 입문을 돌려보는게 나을까요? 기본편을 결제해서 듣는게 나을까요? 기본편이 더 세세한 설명이 있는지도 궁금합니다
-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
신입개발자 커리큘럼 고민
신입 개발자 입니다!다름이 아니라 제가 회사에서 아직 교육기간이라 선생님의 강의를 듣고있는데요,스프링입문 강의를 1회 완강을 해도 확실히 와닿지가 않아서 한 번 더 들을까 생각중인데..일단 진도를 쭉쭉 치고 나가는게 좋을지 아니면 스프링입문을 한번 더 듣고 기본편,HTTP… 이렇게 나가는게 좋을지 여쭤보고자 문의 남깁니다한달뒤에 교육이 끝나면 프로젝트에 투입되는 상황이라 고민이 됩니다..!
-
스프링 핵심 원리 - 기본편
현재 강의를 듣고 다음 강의를 어떤걸 수강해야 할지 고민입니다
현재 강의 에선 야생형 코스를 추천 해주시는데 저는 강의를 로드맵으로 구매하여 수강중 입니다. 현재 로드맵은 http mvc db 접근 순으로 짜여져 있는것으로 알고 있습니다.지듬 다음으로 강의에서 추천해주신 커리큘럼 방향의 강의는 다른 로드맵에 있는 강의인것으로 알고 있는데 현재 로드맵에 해당하는 Http강의를 수강후 Mac강의를 이어서 수강하는것은 추천해주시는 방법이 아닌지 고민입니다. 웹 백엔드 개발자 취업을 위해 수강중인데 현재시점에서는 어느 강의를 이어나가는 것이 더 좋을지 방향을 잡아주시면 감사하겠습니다.
-
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
영한님! 질문있습니다
안녕하세요 영한님 강의를 듣고있는 컴퓨터공학과 학생입니다. 스프링 입문부터 기본강의, HTTP 강의, MVC 1,2편을 모두 수강완료하고 이를 바탕으로 혼자서 간단한 홈페이지도 구현해본 상태입니다. 이번에 2학년으로 복학하는데 2-1 목표가 프론트엔드 친구와 함께 간단한 프로젝트를 하는게 목표입니다. 그런데 지금까지 들어본 강의를 보면 프론트엔드와의 협업보다는 백엔드 혼자서 로직도 구현하고, 뷰 템플릿도 작성하는 형태인거 같습니다. 최근에는 RestFul Api 기반으로 백엔드는 api만 작성하고, 프론트에서 뷰 템플릿까지 처리해주는걸로 알고 있습니다. 지금 가지고 있는 백엔드 지식은 영한님 강의를 통해 배운 내용정도입니다. DB나 API 설계방법, 배포 방법, 시큐리티 등등에 대해서는 모르는 상태입니다. 프론트엔드와 협업하기 위해서 어떤 강의를 듣는게 나을까요?
-
실전! 스프링 데이터 JPA
JPA 프로젝트 성능테스트 환경 구축 질문있습니다.
강사님의 강의를 보고 Spring/JPA 토이 프로젝트를 만들고 성능 테스트를 진행해보려고 합니다.현재 프로젝트는 AWS EC2 프론티어 클라우드 서버에서 구동 중인데, 성능 테스트 시 aws를 이용하게 되면 부담스러운 비용이 발생할까봐 우려되었습니다.때문에 로컬 환경에서 가상머신을 띄우고 실구동환경의 컴퓨팅 자원과 동일하게 세팅한 뒤 테스트를 진행해보려고 하는데, 이러한 방식으로 진행한 테스트 결과가 실제 서버에 적용할 수 있을만큼 유의미한지 궁금합니다. 질문 읽어주셔서 감사합니다.
-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
java 중급강의 언제나오나요?!
김영한님 java 중급강의가 24년 초에 나온다고 알고 있는데 3,4월쯤에 나올나요??
-
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP 수강 중 에러.
질문탭으로 가야하는데 고민으로 작성했네요... 수정으로는 이동이 안되는데 이동 가능하다면 부탁드립니다.ㅠㅠ===========================================AOP 수강 중 에러가 발생했는데 어디를 건드려야할지 잘 모르겠어서 문의 남깁니다.우선 강의와 다른 환경으로 실습해보고 있어 조금씩 코드가 다릅니다.먼저 에러 메세지는 아래 2개입니다.org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberController' defined in file [D:\dev\java\hello-spring\out\production\classes\hello\hellospring\controller\MemberController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.hellospring.service.MemberService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.hellospring.service.MemberService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}2번 메세지를 보게 되면 MemberService타입의 Qualifying 한 bean이 존재하지 않아 wiring 할수 없다는 에러인데. 스프링을 처음 해보는 입장에서는 그대로 따라 쳤는데 되지 않아 어떻게 더 수정해야할지 고민입니다.관련된 코드 블럭을 첨부 드립니다.SpringConfig.Javapackage hello.hellospring; import hello.hellospring.repository.*; import hello.hellospring.service.MemberService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfig { // private EntityManager em; private final MemberRepository memberRepository; public SpringConfig(MemberRepository memberRepository) { this.memberRepository = memberRepository; } // public SpringConfig(EntityManager em) { // this.em = em; // } @Bean public MemberService memberService(){ return new MemberService(memberRepository); } // @Bean // public MemberRepository memberRepository(){ //// return new MemoryMemberRepository(); //// return new JdbcMemberRepository(dataSource); //// return new JdbcTemplateMemberRepository(dataSource); //// return new JpaMemberRepository(em); // } }MemberService.Javapackage hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.JdbcMemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @Component public class MemberService { private final MemberRepository memberRepository; @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } /* * 회원가입 */ public Long join(Member member){ //같은 이름이 있느 중복 회원X validatedDuplicateMember(member); memberRepository.save(member); return member.getId(); } private void validatedDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); } public List<Member> findMembers(){ return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId){ return memberRepository.findById(memberId); } } application.propertiesspring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none spring.datasource.username=sagradleplugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '21' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' // implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' } tasks.named('test') { useJUnitPlatform() }MemberController.javapackage hello.hellospring.controller; import hello.hellospring.domain.Member; import hello.hellospring.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller public class MemberController { private final MemberService memberService; @Autowired public MemberController(MemberService memberService) { this.memberService = memberService; } @GetMapping("/members/new") public String createForm() { return "members/createMemberForm"; } @PostMapping("/members/new") public String create(MemberForm form){ Member member = new Member(); member.setName(form.getName()); memberService.join(member); return "redirect:/"; } @GetMapping("members") public String list(Model model){ List<Member> members = memberService.findMembers(); model.addAttribute("members", members); return "members/memberList"; } } 감사합니다.
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 환경에서 h2 db 를 사용하는 경우 실용성에 대하여
테스트 환경에서 h2 메모리 db 를 사용하는 방식에 대한 실용성 관련 고민이 있습니다. 프로젝트를 진행하다보면 기본적으로 orm 기반으로 구현을 하지만 일부 예외적인 기능들은 특정 dbms 에 의존적인 쿼리를 직접 실행하는 경우가 불가피하게 발생하는 듯 합니다. 이 경우 특정 dbms(예를들어 mysql) 에 대한 의존성이 발생할 수 밖에 없는데요. 이때 운영 dbms 와 다른 메모리 db(h2) 를 사용하여 테스트를 작성하게 불가능해지고 결국엔 실환경과 동일한 테스트용 db 를 세팅하는식으로 다시 변경하게 되는 듯 합니다. (결국 메모리 db 를 이용한 간단한 테스트를 사용할 수 없는 상황) 실무적인 차원에서 이런 경우 보통 어떤 방식으로 해결하는게 최선일지 궁금합니다.