국비지원

22/05/25 수업정리

야생늑대 2022. 5. 25. 19:43
반응형

WEN-INF 폴더 외부에서는 확인이안되고

 

컨트롤러를 거쳐서 내부에서의 요청은 확인이된다.

 

페이지이동을 위한 컨트롤러를 만들어서 사용한다.

 

 

lombok 사용하기

더보기

 

 

 

lombok jar 파일 다운로드

https://projectlombok.org/download

 

Download

 

projectlombok.org

 

경로에 한글이 없도록 C드라이브에 넣어준다.

 스프링을 종료하고 더블클릭해서 실행해준다.  혹시 실행이안된다면 cmd 창에서 자바 명령어로 실행해준다.

 

실행화면.

기다리면 인스톨이나 업데이트 할 수 있는 목록이 생성되는데 안생긴다면 직접 경로를 찾아서 지정해준다.

학원에서는 스프링에서만 사용할 꺼지만 이클립스도 목록에 나와있으니 같이 인스톨해준다.

 

금방 인스톨이 완료된다.  다시 스프링을 실행하고  적용되었는지 확인해본다.


한글깨짐현상 - 인코딩설정하기

web.xml 파일에 필터태그 추가

<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>		
	</filter>
	
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

위 처럼 코드를 작성하여도 한글이 깨진다면 .jsp 쪽에서 인코딩타입을 안바꿔줘서 데이터가 넘어오기전부터 깨진

 상태여서일 수도 있다.

 

 

 

public class MemberService {

	private ModelAndView mav;
	
	public ModelAndView memberJoin(MemberDto member) {
		System.out.println("MemberService.memberJoin() 호출");
		mav = new ModelAndView();
)
		
		
		mav.setViewName("Main");    //매개변수에  페이지이름
		
		return mav;

 

 

 

 

commons-fileupload 라이브러리 추가하기

 

더보기

 

서블릿 콘텍스트에  설정 추가하기

<beans:bean id="multipartResolver" 
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="defaultEncoding" value="UTF-8" />
		<beans:property name="maxUploadSize" value="10000000" /><!--	10MB -->
		<beans:property name="maxInMemorySize" value="10000000" /><!--	10MB -->
	</beans:bean>

 

파일을 파일이름과 원본파일  로 나누어 담아 사용하기위해 dto 에 필드 추가

 

 

 

@Autowired

 

위 이미지처럼 @Autowired 로 MemberService를 사용하려면 서비스클래스에 @Service 어노테이션을 사용해서 지정해줘야 스프링에서 인식하고 Autowired 기능을 할 수 있다. 

@Service 어노테이션을 생략하게되면 스프링의 관리에 있지않기 때문에 에러가 발생한다.

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'memberController':
Unsatisfied dependency expressed through field 'msvc';
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'com.spring_movie01.service.MemberService' available:
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}

대충 @Autowired 어노테이션으로 지정한 MemberSecvice msvc; 이 선언되어있는 memberController에서  bean을 만드는 중에 실패했다. 서비스패키지의 MemberService 에서 적합한 bean을 찾지 못했다. 적어도 1개이상의 bean이 필요하다라는 뜻인 것 같다.

 

 

 

스프링에서 파일을 처리하기 위한 코드  

@Service
public class MemberService {

	private ModelAndView mav;
	
	@Autowired
	private MemberDao mdao;
	
	//2. 저장경로 설정
	private String savePath = "D:\\work\\spring_movie01\\src\\main\\webapp\\resources\\mprofileUpLoad";
	//파일을 저장할 경로를 변수로 저장
	public ModelAndView memberJoin(MemberDto member) throws IllegalStateException, IOException {
		System.out.println("MemberService.memberJoin() 호출");
		mav = new ModelAndView();
		// 파일저장 파일이름
		MultipartFile mfile = member.getMfile();
		String mprofile = "";
		
		System.out.println(mfile.isEmpty());
		//파일이없으면 ture  있으면 false 
		
		if(!mfile.isEmpty()) {
			System.out.println("첨부파일 있음");
			UUID uuid = UUID.randomUUID();  //32자리의 임의의(랜덤) 코드가 생성
			
			//1. 파일명 생성
			mprofile = uuid.toString()+"_"+mfile.getOriginalFilename();
			//프로필 이미지 파일 저장
			mfile.transferTo( new File(savePath, mprofile));
			//savePath 경로에 mprofile 이름으로 내용이없는 빈파일을 만들고 
			//mfile을 변환해서 담아준다.
			
		}
		System.out.println("mprofile : "+mprofile);
		member.setMprofile(mprofile);
		int joinResult = mdao.insertMember(member);
		System.out.println("join결과 : "+ joinResult);
		//파일이있으면 첨부파일의 이름을 저장, 없으면 빈문자로 저장하도록 작성
		
		//mybatis는 null 을 사용하려면 따로설정을해줘야함	
		
		//회원가입처리 (dao  - insert문)
		
		mav.setViewName("Main");
		
		return mav;		
	}
}

1. 파일을 저장, 삭제 하기 위한 파일 저장 경로를 변수에 저장.   

private String savePath = "D:\\work\\spring_movie01\\src\\main\\webapp\\resources\\mprofileUpLoad";

2. 업로드 한 프로필파일을 변수에 저장.

MultipartFile mfile = member.getMfile();

3.  빈문자로 변수 선언을 하나 한다.

 

String mprofile = "";

4. 파일이 업로드 되지않았을 때도 생각해서 MultipartFile의   .isEmpty() 메소드를 통해 if문 구성

  System.out.println(mfile.isEmpty());
    // isEmpty() 파일없으면 ture  있으면 false 
    if(!mfile.isEmpty(){
    
    }

5. UUID 클래스의  randomUUID() 메소드를 사용 랜덤코드를 생성하는 객체 생성

if(!mfile.isEmpty()) {
			System.out.println("첨부파일 있음");
			UUID uuid = UUID.randomUUID();  //32자리의 임의의(랜덤) 코드가 생성
			
			//1. 파일명 생성
			mprofile = uuid.toString()+"_"+mfile.getOriginalFilename();
			//프로필 이미지 파일 저장
			mfile.transferTo( new File(savePath, mprofile));
			//savePath 경로에 mprofile 이름으로 내용이없는 빈파일을 만들고 
			//mfile을 변환해서 담아준다.
			
		}

 

 

 

 

 

----

 

@Autowired

 

스프링을 실행하면 스프링에서 서블릿콘텍스트에서

 

<context:component-scan base-package="com.spring_movie01.*" />

 

에 지정되어있는 경로에서 어노테이션을 검색(스캔)하고 루트콘텍스트? 서블릿콘텍스트에 bean 객체를 생성한다.

생성된 bean객체를 사용하려면  new연산자로  생성자를 만들면안되고  루트?서블릿?콘텍스트에서 받아와야한다.

이 컨텍스트의 bean객체는 어디서든 공유 가능하기 때문에 자동 의존성 주입 어노테이션을 이용해 객체를 받아올 수 있다.

@Autowired(자동 의존성 주입)  는  

 

 @Controller  @Service  @Repository   어노테이션

 @Component  부모 어노테이션

 

4가지의 어노테이션이 있는데  이 4가지를 붙여줘야 컨텍스트에 bean객체가 생성된다.

모두 bean 객체를 생성해주고 딱히 다른 기능이 있는게 아니라서 뭘써도 상관은 없지만

명시적으로 구분하기 위해 분리해서 사용한다.

부모 어노테이션인 @Componen를 붙여줘도 똑같이 컨텍스트에 생성되지만 가시성이 떨어져 잘 사용하지 않는다.

그리고 객체내에서 데이터 변경 작업이 있는 VO(DTO) 객체와 같은 경우는 동기화 문제로 인해 bean 객체로 

사용하지 않는다. bean 객체는 항상 데이터 변경이 없는 객체에 한해 사용하는 점에 유의해야한다.

 

@Controller : 웹 요청과 응답을 처리한다.

 

@Service : 내부에서 자바 로직을 처리한다.

 

@Repository : DB나 파일같은 외부 I/O 작업을 처리한다.

 

컨트롤러, 서비스, Dao 클래스의 메소드를 호출할 수 있다는 것은  그 메소드를 멤버로 가지고 있는 객체가 어딘가에 만들어져있다는 것.

컨텍스트에 어노테이션 된 bean객체가 존재하기 때문에 생성자로 객체를 만들지 않아도 객체의 메소드를 사용할 수 있다.

Autowired 를 사용할꺼면 new 생성자를 사용하지 않고 Autowired만 사용해주는 것이 좋다. 충돌로 에러가 날 수 있다.

 

예외로 다른 메소드 안에   ??

 

 

반응형

'국비지원' 카테고리의 다른 글

프로젝트 에러 - Uncaught ReferenceError: clickZzim is not defined  (0) 2022.07.28
22/05/30 수업정리  (0) 2022.05.30
22/05/24 수업정리  (0) 2022.05.24
스프링 다운받고 설정하기  (0) 2022.05.20
22/05/18 수업정리  (0) 2022.05.18