반환값 수정
int로 반환하면 js에서는 <integer>1</integer>이런식으로 document string으로 받기때문에.. 반환값의 타입을 수정하고 관련 js메소드도 수정함
반환값 수정
int로 반환하면 js에서는 <integer>1</integer>이런식으로 document string으로 받기때문에.. 반환값의 타입을 수정하고 관련 js메소드도 수정함
1. jar 와 war?
war: 톰캣이 어플리케이션 바깥에 있다. 하나의 톰캣으로 여러개의 다른 어플리케이션을 돌릴 수 있다. 즉 별도의 웹서버와 웹 어플리케이션을 필요로 한다. 또한 war 방식의 패키지 구조를 사용한다.(WEB-INF 가 있는 jsp구조)
스프링부트의 경우 내장톰캣이 있어서 '실행가능한 jar(Executable jar)로 동작한다.
2. 어플리케이션마다 필요한 JDK버전, 톰캣버전이 상이한데.. jar로 배포하는 경우 그러면 운영체제 하나에서 돌아가는 모든 어플리케이션의 버전을 통일해주어야 함. -> 격리된 환경에서의 배포가 필요!!( 그래서 도커를 쓴다)
3. 도커를 사용하면- 같은 포트로 어플리케이션을 돌릴수있다!!
왜냐하면 운영체제 관점에서는 도커도 하나의 어플리케이션이기때문에
운영체제 { 12345포트 도커1: {8080 WAS}
12346포트 도커2: {8080 WAS}
12347포트 도커3: {8080 WAS} }
이런 식으로 되어있기 때문이다!! 그래서 같은 8080포트로 어플리케이션을 부를 수 있게 된다.
4. jar안에는 JDK가 포함되어있고, path를 유지하므로- 다른 환경일지라도 동일한 실행을 보장할 수 있다.??
5. PATH : java. 어플리케이션을 실행해주는 녀석 . 경로는 한개.
CLASSPATH: 프로그램이 실행될때 필요한 자원의 경로들. 여러개가 될 수 있다. 여기를 순회하면서 요구하는 파일이 있는지 찾아서 실행. (ex) application.properties )
6. 상대경로가 숨어있다
spring.datasource.url=jdbc: sqlite:[프로그램ROOT]sample.db
->절대경로로 바꾸어서 다시 실행해보기
7. 배포를 시도해보기!!!
1. 검색어를 입력하면 결과를 반환해주는 restController작성
2. Postman으로 테스트. status 200과 함께 잘 반환되고 있다.
getMapping이기 때문에 쿼리스트링으로 파라메터가 날아간다.
1.
마이바티스의 insertSelectkey 를 이용해서 FK를 transactional로 insert하는 처리를 할것이다.
일반적인 insert와 달리 insertSelectkey를 쓰면, 직후 getRNo를 했을때 해당 식별자 값이 null이 아니라 nextval로 불러온 값을 반환받을 수 있다.
1. 파일 이름 받을때 한번 더 거른다.
2. 메서드에 throws Exception 걸어서 혹여나 Exception발생시 프레임워크가 처리해줄수있도록 수정. service관련 메서드에도 전부 추가함!!
1. getOriginalFileName()메소드 문제 :
해당 파일명에 공백 이나 .(점) 혹은 /(슬래쉬)같은 문자가 포함되어있을경우 .. 저장했을때 원하지 않았던 결과가 초래될 수 있음!! 상위 디렉토리로 계속 올라가서 공격한다든지..!! 따라서 이 메소드를 그대로 사용하지 말고 파일이름을 한번 걸러내거나- 혹은 filename은 빼고 uuid로만 서버에 저장하고, filename은 db컬럼으로만 저장해서 사용자에게 보여줄 때는 filename만 표시한다.
ex) ././././aaa.jpg
2. 사용자 정의 Exception과 RunTimeException
3. 불필요한 try - catch를 지우고 프레임워크가 Exception을 처리해주도록 throws하기(더욱 간결한 코드!)
프레임워크는 - 내가 만든 코드를 실행해준다. Exception날 수 있는부분만 try catch로 감싸서 해결할 생각 x ,( try catch이외의 부분에서 오류나면 어떡할거얏.) 그냥 throws하고- 프레임워크가 handle해주도록 맡긴다. 그것이 프레임워크의 역할이고 장점!
4. OS는 사용자가 올리는 파일이 그림파일인지 무언지.. 그런 종류를 인식할 수 있어서는 안된다. 그냥 하나의 String으로만 인식해야 한다. 그렇지 않으면 OS가 넘 똑똑해서 '앗 그림파일이다 읽어들여야지~~'하고 메모리에 올렸는데 그순간 악성코드 실행!! 같은 결과가 초래될 수 있다. (버퍼 오버플로우 공격) 따라서 그냥 File그 자체로 저장하고, 암호화하는 것이 좋다.
5.
GET: 정적자원 호출 , HTML의 캐시기능을 활용하여 좀더 빠르게 응답
POST: 동적자원 호출 , 동적으로 변경되는 서비스를 제공하고 싶을 때 사용하는 메서드
6. 응집도란 ? 하나의 모듈이 가질 수 있는 기능들이 모아진 정도
7. 패키지 묶을 때: 도메인 별로 묶고 . 만약에 어떤 service가 다른 도메인과 연관되어 비지니스 로직을 수행한다면 - 해당 repository 혹은 mapper를 has a로 껴안는게 아니라. 해당 도메인 소속의 service를 가져와서 이용하자. service 끼리는 맘껏 불러두 된다 ㅎㅎ!! 사용자에게 제공하는(노출되는) 기능이므로.
8. SQLlite??알아보기. 개발환경과 운영환경에서의 다른 DB -> 이거 application - profile명 - properties 파일로 뭔가 조절할 수 있을 듯한?!!
1. pom.xml의 dependency에
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
추가
2.
log4j.xml파일이 존재하는 경로에 log4jdbc.log4j2.properties를 아래와 같이 추가 (main과 test양쪽에 추가한다.)
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
3. root-context.xml 수정.
value 부분과 jdbcUrl부분을 수정해야 한다!!
1. 오라클 datasource 설정
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@1)DB이름?TNS_ADMIN=2)키가 존재하는 폴더" />
<property name="username" value="3)유저이름" />
<property name="password" value="4)패스워드" />
</bean>
이 값은 연결속성에서 확인 가능하다.wallet_databasename.zip to a secure location. Make sure that only authorized users have access to these files.tnsnames.ora which is part of the client credentials download. The tnsnames.ora file contains the predefined service names. Each service has its own TNS alias and connection string.2. 오라클 홈페이지에서 SSO인증을 위한 jar다운로드하기(아래 링크 클릭)
https://www.oracle.com/database/technologies/appdev/jdbc-ucp-183-downloads.html
해당 세개의 jar가 없을 경우 보안connection에러가 뜨기 때문에 다운로드하여 프로젝트의 build path에 추가해 주어야 한다.
해당 프로젝트 우클릭 -> properties -> java build path -> add external jars -> apply
3. 커넥션 테스트 하기
성공!
그외 트러블슈팅은 아래 페이지를 참고하자.
1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다. - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다. - 마지막에 w를 해야 실제로 반영이 된다. 3. mkfs를 하여 어떤 파일시스...