Spring Bean 등록 + web.xml에 인코딩필터 적용

최주영·2023년 7월 11일
0

spring

목록 보기
4/12

pojo 클래스 으로 Bean 등록하기

  • xml 파일 안에다 <beans:bean> 태그를 이용해서 등록
  • id : context 내에서 사용하는 bean 이름
  • class : 대상이되는 클래스지정(패키지명.클래스명)
	// servlet-context.xml 파일
	// Animal 클래스를 default 생성자로 생성해서 bean으로 등록 
	<beans:bean id="bbo" class="com.bs.spring.beantest.Animal"/> // xml파일로 클래스 등록하는 방법 
	 
	// pojo생성시 setter를 이용해서 데이터를 넣어서 생성시키기 -->
	<beans:bean id="bbo" class="com.bs.spring.beantest.Animal">
		<beans:property name="name" value="뽀숑"/> // name 필드를 뽀숑이로
		<beans:property name="age" value="3"/> // age 필드를 3으로
		<beans:property name="height" value="50.4"/>  // height 필드르 50.4로
	</beans:bean> 
    
    // 매개변수있는 생성자를 이용해서 생성시키기 
	// 두개만 넣을경우, 해당 클래스에서 그 타입과 개수에 해당하는 매개변수 있는 생성자를 생성해야함 
	<beans:bean id="bbo" class="com.bs.spring.beantest.Animal">
		<beans:constructor-arg index="0" value="뽀숑"/> // 0번 : 이름 
		<beans:constructor-arg index="1" value="3"/> // 1번 : 나이 
		<beans:constructor-arg index="2" value="50.4"/> // 2번 : 키 
	</beans:bean>
    
    <beans:bean id="dog" class="com.bs.spring.beantest.Animal">
		<beans:property name="name" value="뽀삐"/>
	</beans:bean>
    
    <beans:bean id="emp" class="com.bs.spring.beantest.Employee"
	init-method="initialMethod" destroy-method="destroyMethod">
	// 생성될때 실행시킬메소드 , 소멸될때 실행시킬 메소드 
		<beans:property name="name" value="최주영"/>
		<beans:property name="age" value="24"/>
		<beans:property name="address" value="경기도 안양시"/>
		<beans:property name="salary" value="100"/>
		<beans:property name="dept" ref="dept"/>
	</beans:bean>
    
    <beans:bean id="emp2" class="com.bs.spring.beantest.Employee">
		<beans:constructor-arg index="0" ref="dept"/>
	</beans:bean>
	// 등록하는 bean이 다른 클래스와 연관관계(참조)가 설정되어 있을때는  
	//	다른 bean을 등록해야한다. ref 속성을 이용해서 설정한다.
@Controller // 스프링 빈으로 등록
public class HomController {
	
	// springbean으로 등록된 객체는 필드로 가져와 사용할 수 있음
	// 타입을 찾아서 집어넣음 
	// 문제점 : Animal 타입이 두개이면 NoUniqueBean 예외 발생
	// 해결방법 (1) : 동일한 타입이면, 필드명과 Id값을 비교해서 찾음
	// 해결방법 (2) : @Qualifier 어노테이션을 이용해서 특정 bean을 선택
	@Autowired  
	// 중복된 타입이 있는 경우 @Qualifier 어노테이션을 이용해서 특정 bean을 선택할 수 있음
	@Qualifier("dog")
	private Animal a;
	
	@Autowired
	@Qualifier("bbo")
	private Animal b;
	
	//springBean으로 등록되지않은 객체를 Autowired 하면?
	// 오류 발생! -> 등록되지은 bean은 Autowired 하지못함
	@Autowired(required = false)
	// required = false -> 빈에 있으면 넣고 빈에 없으면 넣지말라는 뜻 (오류발생 x)
	// 많이 사용하는 방식은 아님
	private Employee emp;
	
	@Autowired
	private Employee emp2;
// Employee 클래스
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Employee {
	private String name;
	private int age;
	private String address;
	private int salary;
	private Department dept;
	
	public Employee(Department dept) {
		this.dept=dept;
	}
	
	public void initialMethod() {
		System.out.println(this.getClass().getName()+"클래스생성했다!");
	}
	
	public void destroyMethod() {
		System.out.println("객체 으악!");
	}
}

클래스 방식으로 Bean 등록

  • pojo 클래스를 configuration 으로 사용할 수 있음
  • @Configuration 어노테이션 이용
@Configuration
public class BeanTestConfiguration {
	// springbeanconfiguration.xml과 동일한 기능
	// spring에서 사용할 bean을 자바코드로 등록할 수 있다
	// @Bean 어노테이션을 이용
	// 메소드선언을 통해 등록함
	@Bean
	@Order(1) // Order을 통해 bean의 우선순위를 설정할 수 있다
	public Animal ani() { // 메소드명이 id가되고 반환형은 Animal임
		return Animal.builder()
				.name("킥킥")
				.age(5)
				.height(80)
				.build();
	}
	
	@Bean
	// 등록된 bean에 특정 id값 부여하기
	@Qualifier("sol") // Qualifier 등록시 id값은 sol이됨
	public Employee getEmployee(@Qualifier("sal") Department d) { 
						// 메소드명이 id가되고 반환형은 Employee임
						// @Qualifier("sal") 로 지정
						// 매개변수로만 선언하면, 밑에있는 sal과 Department bean이 겹치기때문에
						// 의존성 주입을 해줌
		return Employee.builder()
				.name("최솔")
				.age(27)
				.address("경기도 안양시")
				.salary(200)
				.dept(d)
				.build();	
	}
	
	@Bean
	public Department sal() { 
		return Department.builder()
				.deptCode(2L)
				.deptTitle("영업부")
				.deptLocation("서울")
				.build();
	}

	@Bean
	public BasicDataSource getDateSource() {
		BasicDataSource source = new BasicDataSource();
		source.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		source.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		source.setUsername("spring");
		source.setPassword("spring");
		return source;
	}
	
	/*
	 * @Bean public Gson gson() { return new Gson(); }
	 */
}
@Controller // 스프링 빈으로 등록
public class HomController {

	
	// java로 등록한 bean 가져오기
	@Autowired
	@Qualifier("ani")
	private Animal c;
	
	@Autowired
	@Qualifier("sol")
	private Employee sol;
	
	@Autowired
	List<Animal> animals;
	
	@Autowired
	private TargetComponent tc; 
	
	// @어노테이션으로 bean 등록
	@Autowired
	private FuntionalTest ft;
	
	// basepackage 외부에 있는 @Component
	@Autowired
	private Test test;
	
	
	@RequestMapping("/test")
	public String home() { // home() 메소드는 서블릿의 do get 역할을함
		System.out.println(a);
		System.out.println(b);
		System.out.println(emp);
		System.out.println(emp2);
		System.out.println(c);
		System.out.println(sol);
		animals.forEach(System.out::println);
		System.out.println(tc);
		System.out.println("functionalTest출력");
		System.out.println(ft);
		System.out.println(ft.getA());
		
		
		// spring에서 파일을 불러올 수 있는 Resource 객체를 제공
		Resource resource = new ClassPathResource("mydata.properties");
		
		try {
			Properties prop = PropertiesLoaderUtils.loadProperties(resource);
			System.out.println(prop);
			resource = new FileSystemResource("D:\\springwork\\spring\\src\\main\\resources\\test.txt");
			Files.lines(Paths.get(resource.getURI()),Charset.forName("UTF-8")).forEach(System.out::println);
			
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		return "index";
	}
}

✅ 모든 부분에 인코딩 필터 적용

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
	<!-- 
		인코딩필터 등록하기 
		spring이 encodingFilter클래스를 제공함	
	-->
	<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> <!-- 모든부분에 encoding 처리함 -->
	</filter-mapping>
</web-app>
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글