728x90
300x250

[심심풀이(pastime)] 근로자 관점에서 급여 산출하기

 

이번에 소개할 내용은 근로자 관점에서 구체적으로 어떠한 원리에 의해서 급여가 산출되는지 궁금한 사람들이 많을 것으로 보인다.

급여 시스템을 생각하기에 앞서, 각종 사회적인 보험 등도 고려를 해야 할 것이고, 수당, 회비 등 여러 혜택을 충분히 고민해야 할 것이다.

 

As for the content to be introduced this time, it seems that many people are curious about the specific principle of salary calculation from the perspective of workers.

 

Before thinking about the salary system, you will have to consider various social insurances, and you will have to consider various benefits such as allowances and membership fees.

 

[이전의 글]

[회계(Account)] 기업 운영하기 - 실무(관리회계) - 입문 [1부], https://yyman.tistory.com/1474, 2020-12-23.

 


1. 사원(신입사원)을 기준으로 하는 시뮬레이터

    (Simulator based on employee (new employee))

 

그림 1. 종업원 - 1명을 놓고 월급 계산해보기

 

그림 1은 종업원 1명을 기준으로 한 월급 계산이다.

시급제로 계산한 건 아니고, 연봉제라고 불리는 월급으로 환산해서 책정한 것이다.

 

Figure 1 shows the calculation of monthly salary based on one employee.

It was not calculated on an hourly basis, but was calculated in terms of a monthly salary called an annual salary.

 

근로계약서에 월급이 책정되면, 법정 근로시간 209시간을 기준으로 나눴을 때, 본인이 받는 시급이 어느 정도인지 가늠할 수 있게 된다.

1차로 5대 보험이라고 불리는 4대 보험이 공제될 것이다.

 

회사에 따라서, 교통 차량, 통근버스를 대절해주는 경우가 있고, 미지급하는 경우가 있다.

잘 알아봐야 할 것이다.

 

If the salary is set in the labor contract, it is possible to estimate how much hourly wages you receive when divided based on 209 hours worked.

First, the four insurances, called the five insurances, will be deducted.

Depending on the company, transportation vehicles and commuter buses may be chartered, and there may be cases where payment is not made.

You will have to find out.

 

여기까지는 흔히 이야기하는 보편적인 급여 산출방법이다.

 

연봉이라고 해서, 무심코 "저는 2,800만원 받습니다."라고 예를 들어서 이야기를 하는 건 부적절하다는 입장이다.

퇴직금 포함인지, 퇴직금 별도인지, 교통비 포함인지, 교통비 미포함인지, 식비 포함인지, 미포함인지 각종 제반적인 부분을 충분히 고민하여 이야기하면 해석이 된다고 본다.

 

So far, this is a common method of calculating pay.

In terms of annual salary, it is inappropriate to say, "I receive 28 million won," for example.

Whether it includes severance pay, separate severance pay, transportation expenses, transportation expenses, food expenses, food expenses, or not.

 


2. 사원(종업원)을 기준으로 상세 계산법
(2. Detailed calculation method based on employee (employee))

 

회사 기준이 아니라, 사원 하나의 관점으로 하나 고안해보았다.

평범한 가정생활을 하기 위해서 몇 가지 소비 활동을 하게 될 것이다.

그런 것을 고려하여 작성한 것이다.

 

I devised one from the perspective of an employee, not a company standard.

In order to live a normal family life, you will do some consumption activities.

It was written in consideration of that.

 

 

그림 2. 근로자 관점의 상세 급여내역서

 

 

그림 3. 근로자 관점의 상세 급여내역서

 

 

그림 4. 근로자 관점의 상세 급여내역서

 

그림 2, 그림 3, 그림 4는 근로자 관점에서 급여가 어떻게 현금흐름이 이뤄지는지 가계(=가정)에서 어느 정도의 순이익, 부채 등이 발생하는지를 충분히 고민하여 작성한 것이다.

실제 봉급은 크게 세금, 각종 사회보험, 회사 출퇴근 교통비, 식비 등을 차감하고 난 이후에 순소득을 얻게 된다.

 

예를 들면, 어머니, 아버지께서 흔히들 어린 자녀들에게 이런 이야기를 하실 때가 있는데, "여보(부인) 이번 달은 생활비가 조금 모자라겠는데, 이번 달은 아이 학교에 각종 지출이 있어서 10만 원이 부족할 거 같아." 이런 이야기를 할 때가 있으셨을 것이다.

 

가정생활의 현금흐름을 차분하게 침착하게 생각해보면, 규모를 가늠할 수 있다고 주장하는 것이다.

 

Figures 2, 3, and 4 are prepared by considering how cash flows from wages from the perspective of workers and how much net income and debt are generated from households (= households).

The actual salary is largely deducted from taxes, various social insurances, company commuting expenses, food expenses, and so on.

For example, there are times when mothers and fathers often say this to their younger children, "Honey (wife) This month, the cost of living will be a little short, but this month, because of various expenses for the child's school, I think 100,000 won will be insufficient. ." There must have been times when you talked about this.

It is argued that if you think calmly and calmly about the cash flows of your family life, you can gauge the scale.

 

현재 개인 사업자는 5대 보험(이하 "4대 보험")이 적용되지 않다.

참고하면 될 것 같다.

 

Currently, private businesses are not covered by the five insurances (hereinafter referred to as "four insurances").

I think you can refer to it.

 

자세하고 정확한 건 세무나 회계를 알려주는 곳이나 정부에 문의해보는 것을 추천한다.

For details and accuracy, it is recommended to consult with the tax or accounting office or the government.

 


3. 첨부(Attachments)]

 

201223_종업원급여산출_학습용.zip
다운로드

 

[GNU/GPL v3 Licences]

 

 


4. 맺음글(Conclusion)

 

이상으로 근로자 관점에서 급여 산출할 수 있는 방법에 대해서 소개하였다.

 


* 참고자료(References)

 

1. Receipt and Payment Account: meaning, definition, example, types, https://byjus.com/commerce/receipt-and-payment-account/, Accessed by 2020-12-22, Last Modified 2020-12-22.

반응형
728x90
300x250

[회계(Account)] 기업 운영하기 - 실무(관리회계) - 입문 [1부]


오랜만에 글을 연재하게 되었다.

이번에 소개할 내용은 많은 사람들이 가장 어려워하는 실무 중 하나로 기업이 어떻게 운영되는지 시스템에 대해서 이론을 토대로 소개하려고 한다.


It has been a long time since I have been writing serials.

This time, I am going to introduce a system based on the theory of how a company operates as one of the most difficult practices for many people.




1. 관리회계 (원장부 작성) / Management accounting


장부 작성은 크게 몇 가지 항목을 토대로 작성해보면 된다.

결코 어려운 건 아니다.


몇 가지 윤곽만 소개해드릴까 한다.


Book creation can be largely based on several items.

It is by no means difficult.

I would like to introduce only a few outlines.



그림 1. 기업 현황 작성하기


기업의 살림은 크게 가정 살림처럼 꾸려진다고 보면 된다.

아버지와 어머니가 월급을 벌어오시면, 그 돈으로 집도 사고, 책도 사고, 학용품도 사고 그렇게 운영된다.

경영학이라는 것은 관리의 측면과 운영의 측면 두 가지가 있다.


지금 여기에서 소개하는 경영학은 운영과 관리 두 가지 측면을 큰 틀로 해서 소개하는 것이다.


It can be considered that corporate housing is largely organized like family housing.

When father and mother earn a salary, the money is used to buy houses, books, and school supplies.

There are two aspects of business administration: management and management.

The business administration introduced here is to introduce two aspects of operation and management as a large frame.



그림 2. 기업 현황 요약 (회계)


순수한 IFRS 회계 방식은 아니다.

건물 등 남을 수 있는 자산은 산출하지 않았다.


감가상각비 등으로 처분 등을 해야 하는 게 이론적으로는 맞긴 하는데 실질적으로는 팔리지도 않으면서 시세는 있는 늦게 팔리긴 하겠지만, 언젠가는 팔린다는 전제하에 재산으로 잡아도 크게 무방하다는 것이다.


It is not pure IFRS accounting.

We have not calculated any remaining assets such as buildings.


It is theoretically correct to have to dispose of it for depreciation expenses, etc., but it is not practically sold, but the market price may be sold late, but it is very safe to hold it as a property under the premise that it will be sold someday.



그림 3. 회사현황(2)



그림 4. 회사현황(3)



그림 5. 회사현황(4)



그림 6. 회사현황(5)


기업은 이러한 재무적인 시나리오를 토대로 운영된다고 보면 될 것 같다.


It seems that companies operate based on these financial scenarios.



2. 관리회계 (원장부 작성) - 인건비 / Management accounting - Labor costs


관리회계 세부항목 중 하나로 인건비 산출에 대한 것이다.

세부 항목 산출에 있어서 어려움이 많은 게 사실이다.

흔히 관리의 측면에서 살펴보면 이런 형태로 추출될 수 있을 것으로 보인다..


One of the management accounting details is about labor cost calculation.

It is true that there are many difficulties in calculating detailed items.

Often, from a management standpoint, it seems that it can be extracted in this form.



그림 7. 관리회계 - 인건비 산정하기




3. 관리회계 (원장부 작성) - 체재비 / Management accounting (preparing the ledger) - staying expenses


체재비를 인건비로 포함해야 할지, 분리해야 할지 논란이 많은 부분이다.

외부에 나가서 업무를 보는 것으로 봐야 하므로 인건비로 보면 안 된다는 의견이 있고, 출장의 성격이 가깝다.

상여금으로 정산해서 체재비를 인건비로 해서 세무처리를 하는 회사도 있을 수는 있다.

근로자도 충분히 고민을 해봐야 하는 문제이다. 근로자 관점으로 보면, 종합소득세 세금 비율이 높아질 수 있다는 것이다.

There is a lot of controversy over whether the cost of staying should be included as labor costs or should be separated.

There is an opinion that it should not be viewed in terms of labor costs because it should be viewed as going outside to see work, and the nature of business trips is close.

There may be companies that settle as bonuses and handle tax treatment using staying expenses as labor expenses.

It is a problem that workers should also consider enough. From a worker's point of view, the global income tax rate could be higher.



그림 8. 관리회계 - 체재비 부문




4. 관리회계 (원장부 작성) - 초기 회사 창업 물품구매 / Management accounting (preparation of ledger)-initial purchase of company startup items


몇 가지 기자재를 구비하면, 회사의 윤곽은 설립할 수 있을 것으로 보인다.

초기 투자하면, 5~7년 정도는 거뜬히 지탱할 수 있다.


With a few equipments in place, it seems that the company profile can be established.

With initial investment, it can easily last 5 to 7 years.


그림 9. 관리회계 - 회사 물품 구매방법


몇 가지 기자재만 자금이 있어서 구매한다면, 여러분도 충분히 회사를 만들 수 있다.

If you only have the money to buy a few equipment, you can build a company.


초기 투자 금액 대비로는 매우 가성비가 높은 회사이다.

It is a very cost-effective company compared to the initial investment amount.


물론 예를 들면, 그렇다는 이야기이다.

Of course, for example, yes.



[첨부(Attachments)]


201222_회사운영하기(일반).pptx

201223_회사운영하기_Excel(일반).zip


(GNU/GPL v3 Licenses)를 적용 받는다.



* [맺음글(Conclusion)]


2부에서는 차량, 금융이자 취득 등에 대해서 소개하도록 하겠다.


[회계(Account)] 기업 운영하기 - 실무(관리회계) - 매출, 비용 [2부], https://yyman.tistory.com/1476, 2020-12-22.
[회계(Account)] 근로자 관점에서 급여 산출하기, https://yyman.tistory.com/1475, 2020-12-23.



* 참고자료(References)


1. Profit and Loss Account under the IFRs | Blog Antonio Alcocer. ,http://www.antonioalcocer.com/the-income-statement-pl-interntional-financial-reporting-standards/, Accessed by 2020-12-22, Last Modified 2020-12-22.

반응형
728x90
300x250

[컴퓨터 - PC활용] MobaXterm - (Home Edition) 소개 - SSH 프로그램


이번에 소개할 프로그램은 MobaXterm이라는 프로그램을 소개하려고 한다.

MobaXterm이라는 프로그램은 SSH Client에 사용하는 프로그램이라고 보면 된다.


(작성중이다.)


[작성 환경]

* 운영체제: Microsoft Windows 7, 10



1. 소개


MobaXterm 사이트에 접속한다.




그림 1. MobaXterm - 소개



그림 2. MobaXterm - Download


Home Edition의 "Download now"를 클릭한다.



그림 3. MobaXterm Home Edition


MobaXterm Home Edition v20.6(Portable edition)

MobaXterm Home Edition v20.6(Installer edition)


둘 중 하나를 받으면 된다.


* 어렵고 복잡한 프로그램인가요?

= 아니다.


* 참고로 기업에서 사용하면, 유료이다.



2. 실행하기


MobaXterm Portable 프로그램을 실행하는 방법에 대해서 소개하도록 하겠다.



그림 4. MobaXterm Personal 20.6 버전


MobaXterm_Personal_20.6.exe를 실행하면 MobaXterm 프로그램을 실행할 수 있다.



3. 사용하기


MobaXterm을 실행하면 아래의 화면을 볼 수 있다.



그림 5. MobaXterm Personal 20.6 버전


Session을 클릭하면, 환경 설정 창이 뜬다.

SSH를 누른다.


[참고사항]

반드시 SSH만 되는 것이 아니고, RDP, Telnet, SFTP, VNC 등 다양한 클라이언트를 사용할 수 있다




그림 6. MobaXterm Personal 20.6 버전


Remote host의 아이피주소와 Specify username을 입력한다.

OK를 누르면 아래의 그림처럼 접속화면을 볼 수 있다.



그림 7. MobaXterm Personal 20.6 버전


그림 7은 접속한 모습이다.

이렇게 뜨면 잘 뜬 것이다.




4. 맺음글(Conclusion)


MobaXterm 프로그램 사용방법에 대해서 소개하였다.



5. 참고자료(References)


1. MobaXterm free Xserver and tabbed SSH client for Windows, https://mobaxterm.mobatek.net, Accessed by 2020-12-05, Last Modified 2020-12-05.

반응형
728x90
300x250

[컴퓨터 - PC활용] Golden - Benthic Software(오라클 전용 - MS윈도우) 프로그램


이번에 소개할 프로그램은 오라클(Oracle)사에서 판매하고 있는 사용 쿼리(질의/Query) 도구에 대해서 소개하려고 한다.


좋은 프로그램인가요?

= SQL 쿼리만 다루고자 하는 경우에는 좋을 수도 있다.

완벽하게 좋다고는 볼 수 없다. 제한된 사항, MS윈도에서만 동작하는 한계점 등은 어떻게 할 방법이 없기 때문이다.


고민해볼 만한 주제:

우분투, 리눅스, CentOS, LinuxMint 등 다 기종 운영체제에서는 가능한지?


(작성중)


개인적으로는 그렇게 딱히 추천하고 싶진 않으나, 하나의 장점은 테이블 구조 등 불필요한 정보의 노출을 최소화하는 프로그램이라고 보면 적합할 거 같다.

장단점이 있으니 글을 연재하도록 하겠다.



1. 소개


Benthic Software - High quality SQL query and database tools ( benthicsoftware.com )

이 사이트를 접속하도록 한다.



그림 1. Golden 7 사이트



그림 2. Golden 7 사이트




그림 3. Golden 7 사이트




2. Golden 설치 사양


Benthic Software의 "Golden"을 설치하기 위해서는 아래와 같은 사양이 필요하다.


[설치]

- Microsoft Windows 7, 10
- Oracle Instants Clients (필수)

- Golden


[기타 환경설정]

tnsnames.ora




3. Golden 다운로드 받기


아래의 그림처럼 Golden 7을 선택한다.

클릭한다.


그림 4. Golden 7 설치하기


기다리면, Golden7setup712_64bit.exe 프로그램이 설치된 것을 확인할 수 있다.




4. Golden 설치하기


설치파일을 실행하면, 아래의 그림을 볼 수 있다.



그림 5. Golden 7 설치하기(1)


"I accpet the agreement"를 체크한다.

"Next"를 누른다.



그림 6. Golden 7 설치하기(2)


"Next"를 누른다.



그림 7. Golden 7 설치하기(3)


"Next"를 누른다.




그림 8. Golden 7 설치하기(4)


"Next"를 누른다.



그림 9. Golden 7 설치하기(5)


"Install"을 누른다.



그림 10. Golden 7 설치하기(6)


설치 마법사를 기다린다.



그림 11. Golden 7 설치하기(7)


"Finish"를 누른다.



5. Oracle Instant Clients 설치하기


오라클 공식 홈페이지에 접속하면, Oracle Instant Clients를 내려받을 수 있다.

Oracle Software Downloads | Oracle (https://www.oracle.com/downloads/)



그림 12. Oracle 공식 홈페이지



그림 13. Oracle 공식 홈페이지


해당하는 윈도우 버전을 내려받으면 된다.

참고로 Oracle Instant Client는 다양한 운영체제를 지원하고 있다.


Instant Client는 오라클 로그인없이 내려받을 수 있도록 배포하고 있다.


-> Instant Client for Microsoft Windows (x64)



6. Oracle Instant Clients 설치하기


instantclient_19_9 폴더를 C:\ 또는 D:\ 드라이브에 설치한다.



그림 14. instantclient_19_9 설치하기


설치가 완료되었으면, 다음은 tnsnames.ora 파일을 설치하는 방법에 대해서 소개하겠다.




7. Tnsnames.ora


초기에는 아마 없을 수도 있다. 

Oracle Express Edtion이나 Oracle Databases를 설치하지 않는 이상 또는 설치파일만 내려받았을 때 제공하는 파일이라서

없을 수가 있다.


하나 예제로 첨부하도록 하겠다.


[참고사항] - Oracle XE 11g Edition을 설치하면 제공하는 경로
C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN


XE =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = Sample)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = XE)

    )

  )


EXTPROC_CONNECTION_DATA =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

    )

    (CONNECT_DATA =

      (SID = PLSExtProc)

      (PRESENTATION = RO)

    )

  )


ORACLR_CONNECTION_DATA = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 

    ) 

    (CONNECT_DATA = 

      (SID = CLRExtProc) 

      (PRESENTATION = RO) 

    ) 

  ) 



[첨부(Attachments)]

tnsnames.zip


이 파일이 있어야만 golden(Benthic Software) 제품을 실행할 수 있다.



그림 15. tnsnames.ora - 복사, 붙여넣기 하기


tnsnames.ora 파일을 "복사, 붙여넣기"한다.




8. Golden 실행하기


골든 실행하는 방법은 매우 간단하다.



그림 16. Golden 7 실행하기


평가버전은 "Agree"를 누르고 진행하면 된다.

참고로 30일 체험판이다.

관심이 있다면, 알아보면 도움이 될 수는 있다.



그림 17. Golden 7 실행하기


이렇게 프로그램이 실행되면, 잘 된 것이다.

xe를 선택하고 계정 정보를 입력하고 로그인을 하면, Golden 7을 쉽고 빠르게 사용할 수 있다.



그림 18. 데이터베이스 선택하기 - Golden



9. Golden - 데이터베이스 질의 조회


Oracle XE 11g를 예제로 접속하였다.


select * from USER_OBJECTS;


이러한 명령어를 치면 아래의 테이블이 조회된다.



그림 19. 질의 조회하기




10. 참고자료(References)


1. Benthic Software - High quality SQL query and database tools, https://www.benthicsoftware.com/index.html, Last Modified 2020-12-05, Accessed by 2020-12-05.

2. Oracle Instant Client Downloads, https://www.oracle.com/database/technologies/instant-client/downloads.html, Last Modified 2020-12-05, Accessed by 2020-12-05.

반응형
728x90
300x250

[JSP] 29. 프로젝트 구성 방법 - Eclipse로 살펴보는 보안 프로젝트 구성


오랜만에 글을 작성한다.

이번에 소개할 내용은 시큐어코딩에 대해서 몇 가지 주제를 가지고 소개하려고 한다.

프로젝트 생성 방법에 대해서 몇 가지 소개하려고 한다.


장점: 정보를 보호할 수 있음.

단점: 정보를 보호하는 대신에 개발 메뉴얼 등이 요구됨.

       오류가 나면, 코어 소스를 가지고 있는 인원에 대응해야 하는 한계가 있음.


* 규모가 큰 프로젝트에 적합할 수 있다.

* 갈등이 많은 작은 규모에서도 고려할 수 있다.



1. 프로젝트 생성 방법


기존의 코딩 방법과는 몇 가지 차이가 있을 수 있다.


 


그림 1. 프로젝트 구성의 예1) 보안이 적용된 모습

그림 2. 프로젝트 구성의 예2 - 보안이 적용되지 않는 모습


일반적인 경우라고 하면, 그림 2처럼 프로젝트를 생성하고 개발할 것이다.

그림 1의 방법으로 하면 무엇이 장점이 되는지 소개하도록 하겠다.



2. 불필요한 정보 - 은닉하기


예를 들어서 개발자가 있다고 가정하자.

개발자와 DBA의 권한은 또 한 차원 다른 문제가 된다.

불필요하게 개발자가 DBMS에 접근하여 정보를 조작하는 행위를 가급적 안 하는 것이 좋을 수 있다.

이러한 문제에 직면했을 때, 실질적인 이론 말고 코드와 프로젝트 구성으로서 어떻게 방어해야 할지 알아두면 좋을 듯싶다.


 


그림 3. 정보 은닉이 완료된 시큐어코드


그림 3은 정보 은닉이 완료된 시큐어코드이다.

무슨 이야기인지 그림 4를 살펴 보면서 소개하도록 하겠다.


 

그림 4. jar 파일로 컴파일하기


그림 4는 jar 파일로 공통 함수를 컴파일된 Library를 불러온 것이다.

이렇게 해버리면, 개발자는 제공된 공통함수만 가지고 코딩을 해야 하므로, "서버 계정", "DB 정보" 등 불필요한 요소들에 대해서

접근할 필요가 없어진다.


개발자는 설계된 테이블에 대해서 SELECT, INSERT, DELETE, UPDATE 기능만 구현해주면 된다.


물론 이게 전부 시큐어코딩이라고는 볼 수 없다. 해독하는 프로그램도 종종 있을 수 있기 때문이다.

다만, 정보 노출을 최소화하는 역할을 한다고 보면 된다.



3. 사용 방법(Jar - Export하기)


"Dodo_SmartCoreWeb" 프로젝트를 마우스 오른쪽 버튼을 누른다.

"Export"를 클릭한다.


 

 그림 5. Export 하기


그리고 Jar 파일로 Export할 대상을 선택한다.


 

 그림 6. Jar 파일 - Export하기


JAR file 경로를 "Browse"를 눌러서 지정해준 다음에 "Finish"를 누른다.



4. 사용 방법(Jar - Properties의 Java Build-Path의 Libraries에 User Libraries 등록하기)


프로젝트를 마우스 오른쪽 버튼으로 클릭한다.



그림 7. 프로젝트 속성 - Properties


프로젝트를 클릭한다.

마우스 오른쪽 버튼을 누른다.

Properties를 클릭한다.



그림 8. 프로젝트 속성 - Properties


Java Build Path를 클릭한다.

Libraries 탭을 클릭한다.

Add Library를 클릭한다.



그림 9. Add Library


User Library를 선택한다.

Next를 누른다.




그림 10. Add Library - User Libraries...


User Library를 선택한다.

Next를 누른다.



그림 11. Properties의 User Libraries


New를 클릭한다.



그림 12. New User Library


예를 들면 "HelloCore"라고 입력한다.

OK를 누른다.



그림 13. JAR Selection 모습


Add Jars를 누른다.

예를 들면, SmartWorkJar.jar를 선택한다.

OK를 누른다.



그림 14. Preferences의 모습


등록된 HelloCore의 User Libraries 모습을 확인할 수 있다.

Apply and Close를 누른다.



그림 15. Add Library 창


HelloCore를 선택하고 Finish를 누른다.



그림 16. Java Build Path에 등록된 Hello Core


Java Build Path에 등록된 "HelloCore"를 살펴볼 수 있다.



5. 기대효과


불필요한 소스 코드를 줄이고, 개발자, 관리자, DBA 등 업무 분담 형태의 개발을 구성할 수 있다.

물론, 보안코드를 요구하는 곳에는 이런 형태로 구성할 수 있다.

반응형
728x90
300x250
[Spring-Framework] 42. Spring Framework에서 (Jaxb-runtime, activation, Jaxb Api, JSTL)을 활용한 XML 생성하기


이번에 소개할 방법은 Spring Framework에서 Jaxb-runtime, activation, Jaxb Api, JSTL을 활용하여 XML을 생성하는 방법에 대해서 소개하겠다.


JSP/Servlet 방식하고는 차이가 있는 점이 있다면, @(어노테이션)을 사용할 것이다.


* IDE: Eclipse 2020-06
* Library: Maven Project / Spring Framework 4.2.4 Releases.

1. https://mvnrepository.com/artifact/javax.servlet/servlet-api

   javax.servlet 2.5

2. https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api

   jaxb-api 2.3.0-b170201.1204

3. https://mvnrepository.com/artifact/javax.activation/activation

   activation 1.1

4. https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime

   jaxb-runtime 2.3.0-b170127.1453

5. https://mvnrepository.com/artifact/javax.servlet/jstl

   jstl 1.2



1. 프로젝트 구성도


실제로는 코드가 몇 줄 되지는 않지만, 문제는 라이브러리 셋팅 등에서 오류를 많이 경험할 수 있다.



그림 1. 프로젝트 구성도




2. Java Compiler, Build Path, Project Factes


* Java Compiler - compiler compliance level 1.8
* Build Path -> JRE System Library 1.8
* Project Factes - Java : 1.8



3. pom.xml

이 셋팅이 매우 무척 많이 중요하다.


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.website</groupId>
 <artifactId>example</artifactId>
 <name>Spring-XML-Jaxb</name>
 <packaging>war</packaging>
 <version>1.0.0-BUILD-SNAPSHOT</version>
 <properties>
  <java-version>1.8</java-version>
  <org.springframework-version>4.2.4.RELEASE</org.springframework-version>
  <org.aspectj-version>1.6.10</org.aspectj-version>
  <org.slf4j-version>1.6.6</org.slf4j-version>

 </properties>
 <dependencies>
  <!-- Spring -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${org.springframework-version}</version>
   <exclusions>
    <!-- Exclude Commons Logging in favor of SLF4j -->
    <exclusion>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
     </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
    
  <!-- AspectJ -->
  <dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjrt</artifactId>
   <version>${org.aspectj-version}</version>
  </dependency> 
  
  <!-- Logging -->
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>${org.slf4j-version}</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.15</version>
   <exclusions>
    <exclusion>
     <groupId>javax.mail</groupId>
     <artifactId>mail</artifactId>
    </exclusion>
    <exclusion>
     <groupId>javax.jms</groupId>
     <artifactId>jms</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jdmk</groupId>
     <artifactId>jmxtools</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jmx</groupId>
     <artifactId>jmxri</artifactId>
    </exclusion>
   </exclusions>
   <scope>runtime</scope>
  </dependency>

  <!-- @Inject -->
  <dependency>
   <groupId>javax.inject</groupId>
   <artifactId>javax.inject</artifactId>
   <version>1</version>
  </dependency>
    
  <!-- Servlet -->
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>jsp-api</artifactId>
   <version>2.1</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>
 
  <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
  <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0-b170201.1204</version>
  </dependency>
  
  <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
  <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1</version>
  </dependency>
  
  <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
  <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.3.0-b170127.1453</version>
  </dependency>
 

  <!-- Test -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.7</version>
   <scope>test</scope>
  </dependency>       
 </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


파일명: pom.xml


[첨부(Attachments)]

pom.zip




4. HomeController.java (com.website.example)


package com.website.example;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.website.example.vo.BoardListVO;
import com.website.example.vo.BoardVO;

/**
 * Handles requests for the application home page.
 */

@Controller
public class HomeController {
 
 private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
 /**
  * Simply selects the home view to render by returning its name.
  */
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home(Locale locale, Model model) {
  logger.info("Welcome home! The client locale is {}.", locale);
  
  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
  
  String formattedDate = dateFormat.format(date);
  
  model.addAttribute("serverTime", formattedDate );
  
  return "home";
 }
 
         @RequestMapping(value = "/dataTransform", produces="application/xml")
         @ResponseBody
         public BoardListVO dataTransform(Locale locale, Model model) {

  
              List<BoardVO> boardList = new ArrayList<BoardVO>();
              BoardVO vo = new BoardVO();
             vo.setId(1);
             vo.setTitle("야야야1");
             vo.setSearchCondition("하후");
             vo.setWriter("홍길동");
             vo.setRegDate(java.sql.Date.valueOf("2010-02-01"));
  
             boardList.add(vo);
  
            vo = new BoardVO();
            vo.setId(2);
            vo.setTitle("야야야2");
            vo.setSearchCondition("하후");
            vo.setWriter("홍길동");
            vo.setRegDate(java.sql.Date.valueOf("2010-03-01"));
            boardList.add(vo);
  
            BoardListVO boardListVO = new BoardListVO();
            boardListVO.setBoardList(boardList);
  
            System.out.println("가동중");
  
             return boardListVO;
        }
  
}


파일명: HomeController.java


[첨부(Attachments)]

HomeController.zip



5. BoardVO.java (com.website.example.vo)


package com.website.example.vo;

import java.sql.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;


@XmlAccessorType(XmlAccessType.FIELD)
public class BoardVO {


         @XmlAttribute        // 사용 할 속성
         private int id;
         private String title;
         private String writer;
         private String content;
         private Date regDate;
 
        @XmlTransient        // 사용 안함
         private String searchCondition;
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getWriter() {
  return writer;
 }
 public void setWriter(String writer) {
  this.writer = writer;
 }
 public String getContent() {
  return content;
 }
 public void setContent(String content) {
  this.content = content;
 }
 public Date getRegDate() {
  return regDate;
 }
 public void setRegDate(Date regDate) {
  this.regDate = regDate;
 }
 public String getSearchCondition() {
  return searchCondition;
 }
 public void setSearchCondition(String searchCondition) {
  this.searchCondition = searchCondition;
 }
 
 
 
}


파일명: BoardVO.java


[첨부(Attachments)]

BoardVO.zip

HomeController.zip



6. BoardListVO.java (com.website.example.vo)


package com.website.example.vo;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "boardList")
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardListVO {


       @XmlElement(name = "board")
        private List<BoardVO> boardList;
 
        public List<BoardVO> getBoardList(){
                 return this.boardList;
        }
 
        public void setBoardList(List<BoardVO> boardList) {
                 this.boardList = boardList;
        }
 
}


파일명: BoardListVO.java


[첨부(Attachments)]

BoardListVO.zip



7. 출력 결과


스프링에서 출력한 XML이다.



그림 2. 출력 결과


BoardVO.zip

HomeController.zip



*음글(Conclsuion)


스프링 프레임워크로 Jaxb2 외 다수 라이브러리를 활용하여 XML을 생성하였다.



* 참고자료(References)


1. A Guide to JAXB Annotations - HowToDoInJava, https://howtodoinjava.com/jaxb/jaxb-annotations/, Accessed by 2020-10-11, Last Modified 2019-02.


2. [Java] JAXB 활용한 Java 객체의 XML 변환 방법, https://haenny.tistory.com/8, Accessed by 2020-10-11, Last Modified 2019-07-09.


반응형
728x90
300x250

[JSP] 28. Maven (Jaxb-runtime, activation, Jaxb Api, JSTL)을 활용한 XML 생성하기


JSP/Servlet으로도 Jaxb2와 각종 Library를 활용하여 XML을 생성할 수 있다.

일반 프로그래밍은 많이 접하였으나, XML은 잘 접해보지 않을 수도 있다.






1. XML을 JSP 파일에 수작업으로 입력하기


XML을 만드는 방법에는 수작업으로 하는 방법이 있겠다.


<xml>

<hama>

     <board>

     </board>

     <board>

     </board>

     <board>

     </board>

</hama>


예를 들면 이런 형태를 JSP에서 for문 등으로 VO를 읽어와서 뿌려주는 방법이 있겠다.

원시적인 방법이고, 자료가 3중, 4중으로 된 것을 처리하고자 했을 때는 수행빈도가 높아지는 단점이 있다.

코드도 복잡해진다.


물론 DB형태에 보관된 자료로 뿌릴 수도 있다.



<%@ page language="java" contentType="text/xml"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 수작업으로 XML 규격을 만들어야 함. -->
<boardList>
 <board>
  <hello>asdf</hello>
 </board>
</boardList>


파일명: xml.jsp


[첨부(Attachments)]

xml.zip




2. JSP/Servlet - Maven Project


org.apache.maven.archetypes    |  maven-archetype-webapp    | 1.4(1.0)를 선택한다.


그림 1. JSP/XML 프로젝트 구성도




3. Java Compiler, Build Path, Project Factes


* Java Compiler - compiler compliance level 1.8
* Build Path -> JRE System Library 1.8
* Project Factes - Java : 1.8



4. Pom.xml 설정


Spring Framework에서도 <dependency>부분은 그대로 사용이 가능하다. (태스트 완료함)

pom.xml에 정의했던 라이브러리를 그대로 사용하는 것이다.

단, 출력하려고 했을 때, Jaxb에 대한 직접 출력을 정의하냐 안 하느냐 이런 차이가 있다.


 <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
 <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.5</version>
     <scope>provided</scope>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
 <dependency>
     <groupId>javax.xml.bind</groupId>
     <artifactId>jaxb-api</artifactId>
     <version>2.3.0-b170201.1204</version>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
 <dependency>
     <groupId>javax.activation</groupId>
     <artifactId>activation</artifactId>
     <version>1.1</version>
 </dependency>
 
 <!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
 <dependency>
     <groupId>org.glassfish.jaxb</groupId>
     <artifactId>jaxb-runtime</artifactId>
     <version>2.3.0-b170127.1453</version>
 </dependency>

 
 <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
 <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
 </dependency>


파일명: pom.xml


[첨부(Attachments)]

pom.zip



5. BoardVO.java (com.website.example.vo)


package com.website.example.vo;

import java.sql.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;


@XmlAccessorType(XmlAccessType.FIELD)
public class BoardVO {


        @XmlAttribute   // 보여줄 항목이다. 이런 뜻
         private int id;
         private String title;
         private String writer;
         private String content;
         private Date regDate;
 
        @XmlTransient    // 출력하지 않겠다.
         private String searchCondition;
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public String getWriter() {
  return writer;
 }
 public void setWriter(String writer) {
  this.writer = writer;
 }
 public String getContent() {
  return content;
 }
 public void setContent(String content) {
  this.content = content;
 }
 public Date getRegDate() {
  return regDate;
 }
 public void setRegDate(Date regDate) {
  this.regDate = regDate;
 }
 public String getSearchCondition() {
  return searchCondition;
 }
 public void setSearchCondition(String searchCondition) {
  this.searchCondition = searchCondition;
 }
 
 
 
}


파일명: BoardVO.java


[첨부(Attachments)]

BoardVO.zip


- 게시판 DB에서도 사용한다고 가정하자.



6. BoardListVO.java (com.website.example.vo)


package com.website.example.vo;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "boardList")
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardListVO {


         @XmlElement(name = "board")
         private List<BoardVO> boardList;
 
         public List<BoardVO> getBoardList(){
               return this.boardList;
         }
 
         public void setBoardList(List<BoardVO> boardList) {
               this.boardList = boardList;
         }
 
}


파일명: BoardListVO.java


[첨부(Attachments)]

BoardListVO.zip


루트 RootElement를 정의해줘야 XML 출력을 할 수 있는데, 출력을 그냥하는 건 아니고, List 형태로 구성된 VO(Value Object)를 출력하는 것이다.




7. HomeController.java (com.website.example.controller)


밑줄 친 부분들이 중요한 부분이다.


package com.website.example.controller;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import com.website.example.vo.BoardListVO;
import com.website.example.vo.BoardVO;


public class FrontController extends HttpServlet {
 private static final long serialVersionUID = 1L;
      
 
 protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  
            res.setContentType("text/xml;charset=utf-8");
    
            String result = setXmlData();
            PrintWriter out = res.getWriter();
  
            out.println(result);
  
            out.flush();
            out.close();

 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  
 }
 
        public String setXmlData(){
  
                 JAXBContext jc = null;
                 Marshaller marshaller = null;
   
                 List<BoardVO> boardList = new ArrayList<BoardVO>();
                 BoardListVO boardListVO = new BoardListVO();
  
                 OutputStream os = new ByteArrayOutputStream();

                 BoardVO vo = new BoardVO();
  
                 try {
                      jc = JAXBContext.newInstance(BoardListVO.class);
    
                 } catch (JAXBException e) {
                      e.printStackTrace();
                 }

                 vo.setId(1);
                 vo.setTitle("야야야1");
                 vo.setSearchCondition("하후");
                 vo.setWriter("홍길동");
                 vo.setRegDate(java.sql.Date.valueOf("2010-02-01"));
  
  boardList.add(vo);
  
  vo = new BoardVO();
  vo.setId(2);
  vo.setTitle("야야야2");
  vo.setSearchCondition("하후");
  vo.setWriter("홍길동");
  vo.setRegDate(java.sql.Date.valueOf("2010-03-01"));

               boardList.add(vo);

               boardListVO.setBoardList(boardList);
  
                try {
                       marshaller = jc.createMarshaller();
                       marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
                       marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
   
                       // marshaller.marshal(boardListVO, System.out);
                       marshaller.marshal(boardListVO, os);
   
                } catch (JAXBException e) {
                       e.printStackTrace();
    
                }

  
                // System.out.println("XML출력:" + os.toString());
   
                return os.toString();

  
        }

}


파일명: FrontController.java


[첨부(Attachments)]

FrontController.zip




8. web.xml (/src/main/webapp/WEB-INF/web.xml)


<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
   <servlet-name>FrontController</servlet-name>
   <display-name>FrontController</display-name>
   <description></description>
   <servlet-class>com.website.example.controller.FrontController</servlet-class>
  </servlet>
  <servlet-mapping>
           <servlet-name>FrontController</servlet-name>
           <url-pattern>/dataTransform.do</url-pattern>
  </servlet-mapping>
</web-app>


파일명: web.java


[첨부(Attachments)]

web.zip



9. 출력 결과


완성된 결과물이다.



그림 2. XML.jsp 파일 (수작업 방법)



그림 3. Jaxb2 외 다수 라이브러리로 적



* 맺음글(Conclusion)


JSP/Servlet 기반에서 XML 출력하는 방법에 대해서 살펴보았다.

반응형
728x90
300x250
[PC활용] Oracle(오라클) - Cmd 명령어로 sqlplus가 동작하지 않을 때 해결 방법


Oracle을 PC에서 설치하여 sqlplus로 작업을 하고자 했을 때 초기 순정 설치했을 때는 sqlplus 명령어가 잘 되지만, 
살다보면 셋팅값을 변경해서 안 켜지는 경우가 있을 수도 있다.


이럴 때 해결하는 방법에 대해서 소개하려고 한다.


[작성환경]

- MS 윈도우 10

- Oracle Databases 설치된 상태


[적용대상]

- Oracle Databases



1. 제어판 - 시스템 속성


몇 가지 간단한 설정으로 다시 사용할 수 있다.


그림 1. 시스템 속성


컴퓨터 -> 속성을 클릭한다. (마우스 오른쪽 버튼)

고급 시스템 설정을 클릭한다.

고급 탭을 클릭한다.

환경 변수(N)을 클릭한다.





그림 2. 시스템 속성


시스템 변수의 "PATH"를 편집한다.

예) C:\oraclexe\app\oracle\product\11.2.0\server\bin

오라클 설치한 경로를 찾아가보면 아래의 그림처럼 sqlplus의 위치를 찾을 수 있다.



[추가 방법]

-> 1. (컴퓨터 -> 속성 -> 환경변수 -> 시스템 변수 -> 새로만들기 

      "ORACLE_HOME" -> C:\oraclexe\app\oracle\product\11.2.0\server

   2. 시스템 변수 (Path 편집) -> %ORACLE_HOME%\bin





그림 3. 오라클 서버 프로그램 폴더

해당 경로에 있는 sqlplus의 모습이다.

반응형

+ Recent posts