본문 바로가기

공부/Spring

[인프런]스프링 입문 정리2

인프런 강의
스프링 입문-코드로 배우는 스프링 부트, 웹mvc,db접근 기술

1.회원 관리예제 -백엔드 개발 : 회원 서비스 개발
ctrl+Shift+Alt+t => extra method  생성가능 이거누르고 톱니바퀴 모양 누르면 상세설정?가능

2.회원 관리예제 -백엔드 개발 : 회원 서비스 테스트
ctrl+Shift+t => Test  생성가능 이거누르고 톱니바퀴 모양 누르면 상세설정?가능
static import => Alt + Enter
ctrl+alt+v => 변수 추출
Shift + F10  전에 실행했던거 재실행 

스프링 처음에 뜰때 스프링 컨테이너가 뜨는데(생기는데) 여기에 이 @Controller가 있으면 
MemberController 객체를 생성해서 스프링에 넣어둠, 그리고 스프링이 관리해서 스프링과 관련된 컨트롤러 기능들을 사용가능한 것
=>스프링 컨테이너에서 스프링 빈이 관리된다고 표현

MemberController에서 MemberService를 가져다 써야하는데 
1)new로 생성해서 쓰기 가능  =>스프링이 관리를 하게 되면 스프링 컨테이너에 등록을 하고 스프링 컨테이너에서 받아서 쓰도록 바꿔야함 왜냐하면 new로 생성해서 하면 멤버컨트롤러 말고 다른 여러 컨트롤러들이 멤버서비스를 가져다 쓸 수 있는데 (주문서비스 등) MemberService들어가보면 별 기능이 없다. 얘는 여러게 인스턴스를 생성할 필요가 없는 것, 하나만 생성해서 공용으로 쓰면 됨
: 스프링 컨테이너에 등록해서 쓰면 하나만 등록해서 쓰면됨 + 부가적인 여러 효과를 많이 볼 수 있음  
2)생성자 만들기 =>MemberController 객체를 생성할 때 생성자도 호출, 그런데 생성자에 @Autowired 붙어 있으면 스프링이 컨테이너에 있는 memberService랑 연결해줌

오류 : memberService를 찾을 수 없다
MemberService들어가보면 순수한 자바 클래스임 => 스프링이 얘를 알 수 있는 방법이 없다 @Service , @Repository로 해결

Controller Service Repository   => 정형화된 패턴임
Controller : 컨트롤러 통해서 외부 요청 받고
Service : 비즈니스 로직 만들고
Repository : 데이터 저장

스프링 빈 등록하는 방법엔 2가지가 있다
1.컴포넌트 스캔과 자동 의존관계 설정 @Component 쓰면 해결됨 (@Service , @Repository, @Controller안에 @Component가 있기 때문에 앞에 3개 써도 적용됐던 것) 
2.자바 코드로 직접 스프링 빈 등록하기

참고
스프링은 스프링 컨테이너에 스프링 빈을 등록시 기본적으로 싱글톤 등록(유일하게 하나 등록,특수한 경우엔 변경 가능), 그래서 같은 스프링 빈이면 모두 같은 인스턴스다.
설정 파일을 직접 운영할 때 장점 : 설정파일만 손대면 구현체 바꿀 수 있음 

회원 웹기능-등록
post 데이터 전달할 떄 주로 씀
get 조회할 떄 주로 씀

Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use
참고 : https://www.inflearn.com/questions/183653/h2%EC%8B%A4%ED%96%89%EC%98%A4%EB%A5%98
콘솔창에서 h2/bin 간다음 여기서  
java -cp h2-1.4.200.jar org.h2.tools.Server -webPort 8083
했더니 됨

org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200]
=> 스프링부트 2.4부터는 `spring.datasource.username=sa`를 꼭 추가해주어야 한다. 그렇지 않으면 `Wrong user name or password` 오류가 발생한다. (오타 제대로 확인하기)

//@Transactional 주석 안하고 돌렸더니 롤백돼서 db에 저장이 안되길래 주석처리하고 했더니 됨
@Transactional // 디비에 저장 안하고 계속 테스트 할려고(insert후 롤백해서 디비에 저장 안됨 : 중복에 걸리지 않아서 계속 테스트 가능)