if("http".equals(request.getScheme())) {
		response.sendRedirect("https://" + request.getServerName() + request.getRequestURI() + '?' + request.getQueryString());
		return;
	}
Posted by Lawmin

댓글을 달아 주세요

CREATE TABLE TSQL.LOG_T
(
  LOG_ID   NUMBER,
  LOG_SYS  VARCHAR2(32 BYTE),
  LOG_TYP  VARCHAR2(32 BYTE),
  LOG_MSG  VARCHAR2(4000 BYTE),
  LOG_DTM  DATE
);

CREATE UNIQUE INDEX TSQL.LOG_T_PK ON TSQL.LOG_T(LOG_ID);

CREATE OR REPLACE PUBLIC SYNONYM LOG_T FOR TSQL.LOG_T;

ALTER TABLE TSQL.LOG_T ADD (
  CONSTRAINT LOG_T_PK
  PRIMARY KEY
  (LOG_ID)
  USING INDEX TSQL.LOG_T_PK
  ENABLE VALIDATE);

GRANT SELECT ON TSQL.LOG_T TO PUBLIC;

CREATE SEQUENCE TSQL.LOG_S
  START WITH 1
  MAXVALUE 9999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  ORDER;


CREATE OR REPLACE PROCEDURE TSQL.log_p(p_log_sys varchar2, p_log_typ varchar2, p_log_msg varchar2)
as
   pragma autonomous_transaction;
begin
   insert into log_t (log_id, log_sys, log_typ, log_msg, log_dtm)
   values (log_s.nextval, p_log_sys, p_log_typ, p_log_msg, sysdate);
   commit;
end;
/

GRANT EXECUTE ON TSQL.LOG_P TO PUBLIC;
Posted by Lawmin

댓글을 달아 주세요

 

<input type="text" id="userId" size="16" maxlength="30" style="ime-mode:disabled;">

<script type="text/javascript">
var resizable = function(el, factor) {
	var unit = Number(factor) || 7.7;
	function resize() {
		el.style.width = ((el.value.length+1) * unit) + 'px'
	}
	var e = 'keyup,keypress,focus,blur,change'.split(',');
	for (var i in e)
		el.addEventListener(e[i],resize,false);
	resize();
}
resizable(document.getElementById('userId'), 10);
</script>

 

Posted by Lawmin

댓글을 달아 주세요

<input type="checkbox" id="agree1" onclick="checkAllCheckbox();"> 
<label for="agree1">[필수] 동의1</label>

<input type="checkbox" id="agree2" onclick="checkAllCheckbox();"> 
<label for="agree2">[필수] 동의2 </label>

<input type="checkbox" id="agreeAll" onclick="toggleAllCheckbox(this);"> 
<label for="agreeAll">전체 동의</label>



<script type="text/javascript">

function checkAllCheckbox() { 
  var agreeAllCheckbox = document.getElementById("agreeAll"); 
  var e = document.querySelectorAll('input[type="checkbox"]:not(#agreeAll)'); 
  for(var i = 0, len = e.length; i < len; ++i) { 
    if(!e[i].checked) { 
      agreeAllCheckbox.checked = false; 
      return; 
    } 
  } 
  agreeAllCheckbox.checked = true; 
}



function toggleAllCheckbox(source) { 
  var e = document.querySelectorAll('input[type="checkbox"]:not(#agreeAll)'); 
  for(var i = 0, len = e.length; i < len; ++i) { 
    e[i].checked = source.checked; 
  } 
}
Posted by Lawmin

댓글을 달아 주세요

1. Static (DI 가 잘되지 않아 env = null 인 경우, EnvironmentAware를 구현)

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfig implements EnvironmentAware {
    final static Environment env;
    
    @Override
    public void setEnvironment(Environment env) {
        MyConfig.env = env;
    }

2. Contructor DI

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfig {
    final Environment env;

    public MyConfig(Environment env) {
        this.env = env;
    }

3. Setter DI

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfig {
    Environment env;

    @Autowired
    public void setEnv(Environment env) {
        this.env = env;
    }

※ Field DI는 권장되지 않아 사용하지 않을 예정

Posted by Lawmin

댓글을 달아 주세요

1. Field DI (Not recommended)

@Controller
public class MyController {
    @Autowired
    MyConfig myConfig;

 

2. Constructor DI (Recommended)

@Controller
public class MyController {
    final MyConfig myConfig;

    public MyController(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

 

3. lombok plugin Constructor DI

@AllArgsConstructor
@Controller
public class MyController {
    final MyConfig myConfig;

 

4. Setter DI

@Controller
public class MyController {
    MyConfig myConfig;

    @Autowired
    public void setMyConfig(MyConfig myConfig) {
        this.myConfig = myConfig;
    }

 

Posted by Lawmin

댓글을 달아 주세요

DB 마이그레이션 작업시 계정 암호를 몰라 private DB LINK를 생성하기 어려울 때가 있다.

(DB LINK의 암호는 암호화값 그대로 dump 라도 뜰 수 있지만...)


이럴 때 아래와 같이 proxy 권한을 부여하여 작업이 가능하다.

(물론 권한만 있다면 db link 뿐만 아니라 다른 object 도 작업 가능하다.)


SQL> ALTER USER user_b GRANT CONNECT THROUGH user_a;


ID: user_a[user_b] 로 접속시 user_a 암호를 입력하여 user_b 로 접속할수 있다. (proxy)


SQL> CONN user_a[user_b]


권한 해제 시,

SQL> ALTER USER user_b REVOKE CONNECT THROUGH user_a;

Posted by Lawmin

댓글을 달아 주세요

1. 무료 윈도우즈(Windows)용 SFTP 서버는 여러가지가 있으며,

   간단히 구성하려면 tiny-sftp-server 를 사용할 수 있습니다. (아래는 이를 이용해 설정)

http://labs.rebex.net/tiny-sftp-server/

https://www.bitvise.com/ssh-server


2. RebexTinySftpServer.exe.config 파일을 수정합니다. (사용할 계정, 자동시작 여부 설정)

<add key="userName" value="계정"/>

<add key="userPassword" value="암호"/>

<add key="userRootDir" value="FTP폴더"/>

<add key="autoStart" value="true"/>


3. 아래와 같은 배치 파일을 만들고, 작업 스케줄러에 주기적으로 실행되도록 설정합니다.

(SFTP 프로세스 죽었을때 다시 실행)

C:\FTP> copy con check_and_run.bat

tasklist /fi "ImageName eq RebexTinySftpServer.exe" /NH 2> NUL | find /I /N "RebexTinySftpServer.exe" || start "" "C:\FTP경로\RebexTinySftpServer.exe"


C:\FTP> taskschd

Posted by Lawmin

댓글을 달아 주세요