728x90

<내가 사용한 방법>

- Oracle DB 기준, Sequnce 사용 방법

 + insert문에 sysdate 추가

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.test.dao.PersonInterface">
    
     <insert id="insertUserInfo" parameterType="HashMap">
	    <selectKey keyProperty="user_no_seq" resultType="integer" order="BEFORE">
	   		 select USER_NO_SEQ.nextval FROM DUAL
  		</selectKey>
	     
    	INSERT INTO PERSON 
    		(USER_NO, C_EMAIL, C_NAME, JOIN_DATE, OS_TYPE)
    		VALUES(
    			   #{user_no_seq},
    			   #{C_EMAIL},
    			    #{C_NAME},
    			   sysdate,
    			   #{OS_TYPE}
    			   )
    </insert>
   
</mapper>

 

 

 

+ 참고

출처: https://taetaetae.github.io/2017/04/04/mybatis-useGeneratedKeys/

 

# selectKey 옵션

Oracle 같은 경우는 Auto Increment 가 없고 Sequence를 사용해야만 하기 때문에 위 옵션을 사용할수가 없다. 하지만 다른 우회적인(?) 방법으로 위와같은 효과를 볼수가 있다.

파라미터의 모델이나 java구문은 위와 동일하고 xml 쿼리 부분만 아래와 같이 설정해주면 된다.

<insert id="insertStudents" parameterType="Student">

<selectKey keyProperty="id" resultType="int" order="BEFORE">

select SEQ_ID.nexyval FROM DUAL

</selectKey>

insert into Students

(id, name , email)

values

(#{id}, #{name}, #{email})

</insert>

위와같은 코드에서 쿼리가 실행되기 전에 id값에 Sequence에 의해 값을 셋팅하게 되고, 자동적으로 해당 값을 Student의 id에 set하게 되서 동일한 결과를 볼수가 있다.

 

 

---------------------------------------------------------------------------------------------------

하단은 추가 참고 사항

 

DBMS 별 selectKey 방법

 

출처 : http://kamsi76.egloos.com/377946

 

MySql

<insert id="insertContent" parameterClass="content">
    <![CDATA[
    INSERT INTO CONTENT (
        CREATED_DATE, TITLE, CONTENT, CONTENT_TYPE
    ) VALUES (
        now(), #{title}, #{content}, #{contentType}
    )
    ]]>
    <selectKey keyProperty="seqId" resultClass="int">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>



MSSQL

<insert id="createProjectBasicInfo" parameterClass="prjIdx">
    <selectKey keyProperty="prj_info_seq" resultClass="int">

        INSERT INTO PRJ_INFO (
            ...
        ) VALUES (
             ...
        ) 
        SELECT SCOPE_IDENTITY()

    </selectKey>
</insert>


Oracle

<insert id="insert_message" parameterClass="java.util.HashMap">
    <selectKey keyProperty="message_id" resultClass="Integer">
        SELECT message_id_seq.nextval FROM DUAL
    </selectKey>
    INSERT INTO guestbook_message (message_id, guest_name, password, message)
    VALUES(#{message_id}, #{gName}, #{pw}, #{ms})
 </insert>

[출처] MyBatis 에서 selectkey 사용 방법|작성자 moonv11

 

 

 

Reference

https://blog.naver.com/moonv11/60181183377

728x90
728x90


에러: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'.

해결방법:에러 발생시 하단의 라이브러를 추가 필요

 

pom.xml 파일 수정

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.0</version>
</dependency>

 

spring boot build.gradle 파일 수정

    compile('javax.el:javax.el-api:3.0.0')

    compile('org.glassfish:javax.el:3.0.0')

 

 

 

Reference

https://knight76.tistory.com/entry/javaxvalidationValidationException-HV000183-Unable-to-initialize-javaxelExpressionFactory-해결하기

 

728x90
728x90

Spring 프로젝트 생성시 Image, JS, CSS 등 정적 resource 파일을 지정된 폴더에서만 사용하도록 설정되어 있음.

(물론, 특별히 지정하면 외부경로 추가도 가능하기는 함)

 

1. 단순히 직접경로 입력하는 방식

 

@GetMapping(
  value = "/get-image-with-media-type",
  produces = MediaType.IMAGE_JPEG_VALUE
)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
    InputStream in = getClass()
      .getResourceAsStream("/com/baeldung/produceimage/image.jpg");
    return IOUtils.toByteArray(in);
}

 

+

@GetMapping : @RequestMapping(method = RequestMethod.GET) 의 축약형

IOUtils = Apach Commons (commons-io) 라이브러리 (pom에 의존성 추가해야함)

 

 

2. Controller에서 webapp 폴더 경로 찾아서 이미지 제공하는 방식

 

@RestController
public class ImageController {
	@Autowired
	ImageService imageService;

	@GetMapping(value = "/image/{imageName}.{extension}", produces = MediaType.IMAGE_PNG_VALUE)
	public @ResponseBody byte[] getImage(
		@PathVariable(name = "imageName") String imageName,
		@PathVariable(name = "extension", required = false, defaultValue = "png") String extension,
		HttpServletRequest request) throws IOException {
		String imagePath = request.getServletContext().getRealPath("resources/image/" + imageName + "." + extension);
		InputStream imageStream = new FileInputStream(imagePath);
		byte[] imageByteArray = IOUtils.toByteArray(imageStream);
		imageStream.close();

		return imageByteArray;
	}
}

 

 

 

+하다가 막힌 문제

HttpServletRequest의 getServletContext() 메서드 사용 문제 (tomcat이랑 servlet 버전 올리면 됨)

https://blog.naver.com/javaking75/220072102739

==> 이렇게 말고 그냥 'request.getSession().getServletContext().getRealPath'이렇게 써도 됨

 

 

Reference

https://blog.naver.com/k220j/220714945944

https://www.baeldung.com/spring-mvc-image-media-data

https://www.baeldung.com/spring-controller-return-image-file

https://countryxide.tistory.com/45 [배워서 남주자]

https://lazymankook.tistory.com/73

728x90
728x90

1. Bean 주요 속성

  • class(필수): 정규화된 자바 클래스 이름
  • id: bean의 고유 식별자
  • scope: 객체의 범위 (sigleton, prototype)
  • constructor-arg: 생성 시 생성자에 전달할 인수
  • property: 생성 시 bean setter에 전달할 인수
  • init method와 destroy method

2019/10/29 - [Dev/Web] - [Spring] Bean 설정 - beans:bean

 

 

2. Bean Scope

 

 

3. property 정리

http://jwlee1728.egloos.com/v/1805102

 

더보기

일반적인 bean 선언
<bean id="testBean" class="com.ljw.TestBean" />

id : spring container 에서 유일하게 실별할수 있는 이름
class : 해당 bean의 full path

id 대신 name 속성을 사용할수 있음
<bean name="testBean" class="com.ljw.TestBean" />


facotry 클래스의 getInstace 를 통한 bean 설정
<bean id="testFactory" class="com.ljw.TestFactory"
          factory-method="getInstance"/>
factory-method : 해당 클래스의 객체를 반환해주는 메소드(singleton에서)


생성자를 통한 bean 설정
<bean id="testService" class="com.ljw.Service">
    <constructor-arg>
        <ref bean="testDao"/>
    </constructor-arg>
</bean>

<bean id="testDao" class="com.ljw.TestDao"/>
 
ref : reference, 즉 testDao id(혹은 name)를 갖는 bean을 생성자의 인자로 넘겨주겠다는 의미   

<bean id="testService" class="com.ljw.Service">
    <constructor-arg ref="testDao"/>
</bean>
이것 역시 위와 같은 의미

생성자에 특정 값을 넣우줄 때
<bean id="testService" class="com.ljw.Service">
    <constructor-arg>
        <value> 10  </value>
     </constructor-arg>
</bean>

혹은 다음과 같이 작성가능
<bean id="testService" class="com.ljw.Service">
    <constructor-arg value="10"/>
</bean>

<value type="long"> 3000 </value> 같이 value 값의 type을 지정해줄수도 있다(기본적으로 string으로 인식)
즉 생성자가 여러가지 유형이 있을경우 위와같이 type을 설정해주지 않으면 기본적으로 string type의 생성자를 먼저 고려하게됨



property bean 설정 방식(setXXX 함수 를 이용하여 bean 설정)

<bean id="testServcie" class="con.ljw.TestService" >
    <property name="testDao">
        <ref bean="implTestDao"/>
    </property>
</bean>

<bean id="implTestDao" class="con.ljw.ImplTestDao" />

property : TestService class의 setTestDao method를 의미

즉 위의 설정은 TestService class의 setTestDao 메소드를 호출하면서 인자 값으로 ImplTestDao 객체를 넘겨준다는 의미


<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/login/login.mw">loginController</prop>
            </props>
        </property>
    </bean>

props : java.util.properties 클래스로 key, value를 string type으로만 갖는다.
즉 위의 예는 SimpleUrlHandlerMapping 클랙스의  setMappings 메소드를통해 properties 객체를 생성하고
해당 properties 객체는 key="/login/login.mw", value = loginController를 갖고 있게된다.



Bean 객체 범위
<bean name="testDao" class="com.ljw.TestDao"/>

TestDao testDao1 = (TestDao)applicationContext.getBean("testDao");
TestDao testDao2 = (TestDao)applicationContext.getBean("testDao");
위 코드를 통해 생성된 testDao는 동일한 객체이다(스프링 컨테이너 내에서 빈 객체는 싱글턴)

bean scope를 명시하여 서로다른 객체로 생성이 가능한데 다음과 같다.

scope="singleon"  : 기본값이며 스프링 컨테이너당 하나의 빈 객체 생성
scope="prototype" : 빈은 사용할때마다 새로운 객체 생성
scope="request"    :  http 요청마다 새로운 객체 생성(WebApplicationContext에서 사용)
scope="session"    :  세션마다 새로운 객체 생성(WebApplicationContext에서 사용)


<bean name="testDao" class="com.ljw.TestDao" scope="protytype" />
--> bean의 scope 속성값에 설정 하여 사용


list, map 등의 컬렉션 에대한 xml 태크가 있긴하지만 위에 정리된 부분만 봐도
spring xml에 대해 이해가 될거라 판단됨.

 

 

 

Reference

https://gmlwjd9405.github.io/2018/11/10/spring-beans.html

https://offbyone.tistory.com/325

http://jwlee1728.egloos.com/v/1805102

 

728x90

+ Recent posts