„Háttéralkalmazások/Záróvizsgatételek” változatai közötti eltérés
→7. Spring: Tétel kidolgozása |
a →5. JPA – általános: Magyarra átírás |
||
| (6 közbenső módosítás ugyanattól a felhasználótól nincs mutatva) | |||
| 71. sor: | 71. sor: | ||
!➖ | !➖ | ||
|- | |- | ||
|teljesítmény | |'''teljesítmény''' | ||
| | | | ||
* gyorsabb lokális feldolgozás | * gyorsabb lokális feldolgozás | ||
| 81. sor: | 81. sor: | ||
* nem lehet igazán jól skálázni | * nem lehet igazán jól skálázni | ||
|- | |- | ||
|szabvány | |'''szabvány''' | ||
| | | | ||
| | | | ||
| 90. sor: | 90. sor: | ||
* így nehezebben karbantartható a kód | * így nehezebben karbantartható a kód | ||
|- | |- | ||
|adatbiztonság | |'''adatbiztonság''' | ||
| | | | ||
* jobb megfelelés az ACID-elveknek | * jobb megfelelés az ACID-elveknek | ||
| 96. sor: | 96. sor: | ||
| | | | ||
|- | |- | ||
|az üzleti logika bárhonnan meghívhatja a szubrutinokat | |'''az üzleti logika bárhonnan meghívhatja a szubrutinokat''' | ||
| | | | ||
* növeli a kód újrafelhasználhatóságát | * növeli a kód újrafelhasználhatóságát | ||
| 121. sor: | 121. sor: | ||
!van mellékhatása? | !van mellékhatása? | ||
|- | |- | ||
|eljárás | |'''eljárás''' | ||
|🟠 lehet | |🟠 lehet | ||
|🟠 lehet | |🟠 lehet | ||
|- | |- | ||
|függvény | |'''függvény''' | ||
|🟢 igen, mindig | |🟢 igen, mindig | ||
|🔴 nem, soha | |🔴 nem, soha | ||
| 407. sor: | 407. sor: | ||
!előnyei | !előnyei | ||
|- | |- | ||
|automatikus | |'''automatikus''' | ||
|<syntaxhighlight lang="csharp" line="1">public class Book | |<syntaxhighlight lang="csharp" line="1">public class Book | ||
{ | { | ||
| 418. sor: | 418. sor: | ||
* a konvenciók alkalmazása kiváltja a további kód írását | * a konvenciók alkalmazása kiváltja a további kód írását | ||
|- | |- | ||
|annotációk | |'''annotációk''' | ||
|<syntaxhighlight lang="csharp" line="1"> | |<syntaxhighlight lang="csharp" line="1"> | ||
public class Book | public class Book | ||
| 434. sor: | 434. sor: | ||
* egyszerű, ismert szintaxis | * egyszerű, ismert szintaxis | ||
|- | |- | ||
|Fluent API | |'''Fluent API''' | ||
|<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | |<syntaxhighlight lang="csharp" line="1">protected override void OnModelCreating(ModelBuilder modelBuilder) | ||
{ | { | ||
| 455. sor: | 455. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|OO-modell | |OO-modell | ||
| rowspan="2" |a fejlesztő C#-ban | | rowspan="2" |a fejlesztő C#-ban | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
|- | |- | ||
|3. | |'''3.''' | ||
|DB-objektumok | |DB-objektumok | ||
|EF Core Migration Tool | |EF Core Migration Tool | ||
| 473. sor: | 473. sor: | ||
!ki / mi készíti? | !ki / mi készíti? | ||
|- | |- | ||
|1. | |'''1.''' | ||
|DB-objektumok | |DB-objektumok | ||
|a fejlesztő SQL-ben | |a fejlesztő SQL-ben | ||
|- | |- | ||
|2. | |'''2.''' | ||
|ORM | |ORM | ||
| rowspan="2" |EF Core Reverse Engineering Tool | | rowspan="2" |EF Core Reverse Engineering Tool | ||
|- | |- | ||
|3. | |'''3.''' | ||
|OO-modell | |OO-modell | ||
|} | |} | ||
=== Hogy néz ki egy entitás, hogyan készítünk kapcsolatokat közöttük? === | === Hogy néz ki egy entitás, hogyan készítünk kapcsolatokat közöttük? === | ||
| 494. sor: | 492. sor: | ||
!N:N | !N:N | ||
|- | |- | ||
|annotációkkal | |'''annotációkkal''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 547. sor: | 545. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|Fluent API-val | |'''Fluent API-val''' | ||
|Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | |Entitások:<syntaxhighlight lang="csharp" line="1">public class Blog | ||
{ | { | ||
| 643. sor: | 641. sor: | ||
!<code>dbContext</code>-függvényhívás | !<code>dbContext</code>-függvényhívás | ||
|- | |- | ||
|create | |'''create''' | ||
|<code>.Dogs.Add(newDog);</code> | |<code>.Dogs.Add(newDog);</code> | ||
|- | |- | ||
|read | |'''read''' | ||
|ld. az előző táblázatot | |ld. az előző táblázatot | ||
|- | |- | ||
|update | |'''update''' | ||
|<code>.Dogs.Find(dogId);</code> | |<code>.Dogs.Find(dogId);</code> | ||
<code>dog.BirthDate = birthDate;</code> | <code>dog.BirthDate = birthDate;</code> | ||
|- | |- | ||
|delete | |'''delete''' | ||
|adatbetöltéssel: | |adatbetöltéssel: | ||
<code>.Dogs.Find(dogId);</code> | <code>.Dogs.Find(dogId);</code> | ||
| 742. sor: | 740. sor: | ||
!létezik | !létezik | ||
|- | |- | ||
| rowspan="2" |a memóriában (perzisztenciakontextusban) | | rowspan="2" |'''a memóriában (perzisztenciakontextusban)''' | ||
|nem létezik | |'''nem létezik''' | ||
|– | |– | ||
|'' | |''lecsatolt'' | ||
|- | |- | ||
|létezik | |'''létezik''' | ||
|'' | |''új'' | ||
|'' | |''menedzselt'' vagy ''törölt'' | ||
|} | |} | ||
| 793. sor: | 791. sor: | ||
!példa | !példa | ||
|- | |- | ||
|egyszerű | |'''egyszerű''' | ||
|elsődleges kulcs alapján | |'''elsődleges kulcs alapján''' | ||
|<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">Person p = entityManager.find(Person.class, 42L);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |feltételekkel | | rowspan="2" |'''feltételekkel''' | ||
|Criteria API | |'''Criteria API''' | ||
|<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | |<syntaxhighlight lang="java" line="1">CriteriaBuilder cb = entityManager.getCriteriaBuilder(); | ||
CriteriaQuery<Person> cq = cb.createQuery(Person.class); | CriteriaQuery<Person> cq = cb.createQuery(Person.class); | ||
| 808. sor: | 806. sor: | ||
Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | Person p = entityManager.createQuery(cq).getSingleResult();</syntaxhighlight> | ||
|- | |- | ||
|Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref> | |'''Query by Example<ref>Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.</ref>''' | ||
|<syntaxhighlight lang="java" line="1">Person probe = new Person(); | |<syntaxhighlight lang="java" line="1">Person probe = new Person(); | ||
ExampleMatcher matcher = ExampleMatcher | ExampleMatcher matcher = ExampleMatcher | ||
| 819. sor: | 817. sor: | ||
List<Person> results = repo.findAll(example);</syntaxhighlight> | List<Person> results = repo.findAll(example);</syntaxhighlight> | ||
|- | |- | ||
| rowspan="2" |nyersen | | rowspan="2" |'''nyersen''' | ||
''(el is lehet nevezni őket)'' | '''''(el is lehet nevezni őket)''''' | ||
|JPQL | |'''JPQL''' | ||
|<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | |<syntaxhighlight lang="java" line="1">TypedQuery<Person> q = entityManager.createQuery( | ||
"SELECT p FROM Person p WHERE p.age > :age", Person.class | "SELECT p FROM Person p WHERE p.age > :age", Person.class | ||
| 829. sor: | 827. sor: | ||
List<Person> list = q.getResultList();</syntaxhighlight> | List<Person> list = q.getResultList();</syntaxhighlight> | ||
|- | |- | ||
|SQL | |'''SQL''' | ||
|<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | |<syntaxhighlight lang="java" line="1">List<Object[]> rows = entityManager.createNativeQuery( | ||
"SELECT first_name, last_name FROM person WHERE age > :min" | "SELECT first_name, last_name FROM person WHERE age > :min" | ||
| 848. sor: | 846. sor: | ||
!miben segít? | !miben segít? | ||
|- | |- | ||
|repositoryk | |'''repositoryk''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends JpaRepository<Bus, Long> { } | interface BusRepository extends JpaRepository<Bus, Long> { } | ||
| 857. sor: | 855. sor: | ||
* kevesebb boilerplate kód | * kevesebb boilerplate kód | ||
|- | |- | ||
|konvenciók | |'''konvenciók''' | ||
használata | '''használata''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
List<Bus> findByLpn(String lpn); | List<Bus> findByLpn(String lpn); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|rendezés | |'''rendezés''' | ||
és lapozás | '''és lapozás | ||
támogatása | támogatása''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | interface BusRepository extends PagingAndSortingRepository<Bus, Long> { | ||
| 875. sor: | 873. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|egyedi | |'''egyedi''' | ||
lekérdezés | '''lekérdezés''' | ||
|<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | |<syntaxhighlight lang="java" line="1">@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")</syntaxhighlight> | ||
| | | | ||
* hosszú metódusnevek helyett kézzel meg lehet írni, és a kívánt nevet lehet adni a metódusnak | * hosszú metódusnevek helyett kézzel meg lehet írni, és a kívánt nevet lehet adni a metódusnak | ||
|} | |} | ||
=== Hogyan valósíthatók meg entitások közti kapcsolatok és az entitások öröklése JPA-ban? === | === Hogyan valósíthatók meg entitások közti kapcsolatok és az entitások öröklése JPA-ban? === | ||
| 893. sor: | 889. sor: | ||
!kétirányú | !kétirányú | ||
|- | |- | ||
|<code>@OneToOne</code> | |<code>'''@OneToOne'''</code> | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 923. sor: | 919. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|<code>@OneToMany</code> | |<code>'''@OneToMany'''</code> | ||
és | '''és | ||
<code>@ManyToOne</code> | <code>@ManyToOne</code>''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Entity | @Entity | ||
| 957. sor: | 953. sor: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
|- | |- | ||
|<code>@ManyToMany</code> | |<code>'''@ManyToMany'''</code> | ||
|<syntaxhighlight lang="java" line="1">@Entity | |<syntaxhighlight lang="java" line="1">@Entity | ||
class A { | class A { | ||
| 1 008. sor: | 1 004. sor: | ||
!<code>@Inheritance(strategy = …)</code> | !<code>@Inheritance(strategy = …)</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|egy táblába, gányul]] | |[[Háttéralkalmazások/Záróvizsgatételek#Egy táblába, gányul|'''egy táblába, gányul''']] | ||
|<code>SINGLE_TABLE</code> | |<code>SINGLE_TABLE</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|külön táblába a valós osztályokat]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába a valós osztályokat|'''külön táblába a valós osztályokat''']] | ||
|<code>TABLE_PER_CLASS</code> | |<code>TABLE_PER_CLASS</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|külön táblába az összes osztályt]] | |[[Háttéralkalmazások/Záróvizsgatételek#Külön táblába az összes osztályt|'''külön táblába az összes osztályt''']] | ||
|<code>JOINED</code> | |<code>JOINED</code> | ||
|- | |- | ||
|[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|absztrakt struktúrába]] | |[[Háttéralkalmazások/Záróvizsgatételek#Absztrakt struktúrába|'''absztrakt struktúrába''']] | ||
|– | |– | ||
|} | |} | ||
| 1 040. sor: | 1 036. sor: | ||
A következő annotációkkal: | A következő annotációkkal: | ||
{| class="wikitable mw-collapsible mw-collapsed" | {| class="wikitable mw-collapsible mw-collapsed" | ||
|+Opciók a legrosszabbtól a legjobbig | |+Opciók (a legrosszabbtól a legjobbig) | ||
!lehet injektálni | !lehet injektálni | ||
!példa | !példa | ||
|- | |- | ||
|mezőbe | |'''mezőbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 059. sor: | 1 055. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|setterbe | |'''setterbe''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 077. sor: | 1 073. sor: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
|konstruktorba | |'''konstruktorba''' | ||
|<syntaxhighlight lang="java" line="1"> | |<syntaxhighlight lang="java" line="1"> | ||
@Service | @Service | ||
| 1 099. sor: | 1 095. sor: | ||
=== Milyen élettartama lehet egy springes beannek? === | === Milyen élettartama lehet egy springes beannek? === | ||
{| class="wikitable" | {| class="wikitable" | ||
|+Scope-ok a leghosszabbtól a legrövidebb életűig | |+Scope-ok (a leghosszabbtól a legrövidebb életűig) | ||
!típus | !típus | ||
!annotáció | !annotáció | ||
!minek az életciklusához van kötve | !minek az életciklusához van kötve | ||
|- | |- | ||
|singleton | |'''singleton''' | ||
|''– (ez az alapértelmezett)'' | |''– (ez az alapértelmezett)'' | ||
|semminek, csak egy van belőle az egész alkalmazásban | |semminek, csak egy van belőle az egész alkalmazásban | ||
|- | |- | ||
|application | |'''application''' | ||
|<code>@Scope("application")</code> | |<code>@Scope("application")</code> | ||
|<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | |<code>ServletContext</code><ref>Webalkalmazásoknál használatos.</ref> | ||
|- | |- | ||
|prototype | |'''prototype''' | ||
|<code>@Scope("prototype")</code> | |<code>@Scope("prototype")</code> | ||
|új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | |új példány jön létre minden <code>getBean()</code> (<code>@Autowired</code>) hívásra | ||
|- | |- | ||
|websocket | |'''websocket''' | ||
|<code>@Scope(scopeName="websocket", proxyMode=...)</code> | |<code>@Scope(scopeName="websocket", proxyMode=...)</code> | ||
|<code>WebSocket</code> session | |<code>WebSocket</code> session | ||
|- | |- | ||
|session | |'''session''' | ||
|<code>@Scope("session")</code> | |<code>@Scope("session")</code> | ||
|HTTP session | |HTTP session | ||
|- | |- | ||
|request | |'''request''' | ||
|<code>@Scope("request")</code> | |<code>@Scope("request")</code> | ||
|HTTP-kérés | |HTTP-kérés | ||
|} | |} | ||
=== Hogyan könnyíti meg a JPA használatát a Spring Data JPA? === | === [[Háttéralkalmazások/Záróvizsgatételek#Hogyan bővíti a lehetőségeket a Spring Data JPA a lekérdezések megfogalmazásának területén?|Hogyan könnyíti meg a JPA használatát a Spring Data JPA?]] === | ||
... | === Hogyan támogatja a tranzakciókezelést a Spring? === | ||
Egységes API-ja van, ami mögé ezeket a tranzakciókezelőket lehet berakni: | |||
{| class="wikitable" | |||
|+Tranzakciókezelők (az alacsonyabb szinttől a magasabbig) | |||
!típus | |||
!jellemzői | |||
|- | |||
|'''JDBC''' | |||
|– | |||
|- | |||
|'''EntityTransaction (JPA)''' | |||
|ld.: ''[[Háttéralkalmazások/Záróvizsgatételek#Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!|Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!]]'' | |||
|- | |||
|'''JDO (Java Data Objects)''' | |||
|a ''JTA'' elődje | |||
|- | |||
|'''JTA (Jakarta Transactions)''' | |||
|szolgáltatásokon átívelő tranzakciókat lehet végrehajtani | |||
|} | |||
{| class="wikitable" | |||
|+Tranzakciókezelés módjai (a kevésbé népszerűtől a népszerűbbig) | |||
!típus | |||
!hogyan indítjuk / | |||
zárjuk le a tranzakciókat? | |||
!példa | |||
|- | |||
|'''programozott''' | |||
|a kódban | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
private final PlatformTransactionManager transactionManager; | |||
public OrderService(PlatformTransactionManager transactionManager) { | |||
this.transactionManager = transactionManager; | |||
} | |||
public void processOrder() { | |||
TransactionStatus transactionStatus = transactionManager | |||
.getTransaction(new DefaultTransactionDefinition()); | |||
try { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
transactionManager.commit(transactionStatus); | |||
System.out.println("Transaction committed successfully!"); | |||
} catch (RuntimeException ex) { | |||
transactionManager.rollback(transactionStatus); | |||
System.out.println( | |||
"Transaction was rolled back due to the following error: " + ex.getMessage() | |||
); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|'''deklaratív''' | |||
|metódusannotációkkal | |||
|<syntaxhighlight lang="java" line="1"> | |||
@Service | |||
public class OrderService { | |||
@Transactional | |||
public void processOrder() { | |||
validateOrder(); | |||
chargeCustomer(); | |||
saveOrderToDatabase(); | |||
// kezeletlen kivétel esetén a Spring automatikusan rollbackel | |||
} | |||
} | |||
</syntaxhighlight> | |||
|} | |||
{| class="wikitable" | |||
|+A <code>@Transactional</code> paraméterei | |||
!paraméter | |||
!értéke | |||
|- | |||
|<code>(no)rollbackFor(ClassName)</code> | |||
|milyen kivételek esetén legyen rollback | |||
|- | |||
|<code>timeout</code> | |||
|az időkorlát másodpercben | |||
|- | |||
|<code>isolation</code> | |||
|izolációs szint (a JPA nem támogatja) | |||
|- | |||
|<code>value</code> | |||
|a tranzakciókezelő azonosítója (több adatbázis esetén fontos) | |||
|- | |||
|<code>propagation</code> | |||
|kompatibilitás egy tranzakcionális metódusból hívott másik tranzakcionális metódussal | |||
|} | |||
{| class="wikitable" | |||
|+A <code>propagation</code> értékei (a megengedőbbtől a szigorúbbig) | |||
! rowspan="2" |érték | |||
! colspan="2" |mit tesz a jelenlegi függvény... | |||
! colspan="2" |mi történik a következő függvénnyel? | |||
|- | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
!...ha van aktív tranzakció? | |||
!...ha nincs aktív tranzakció? | |||
|- | |||
|'''<code>REQUIRED</code>''' | |||
(alapértelmezett) | |||
|azt folytatja | |||
|újat hoz létre | |||
|a jelenlegit folytatja | |||
|– | |||
|- | |||
|'''<code>NESTED</code>''' | |||
|folytatódik, és egy <code>SAVEPOINT</code>-ot hoz létre | |||
|újat hoz létre | |||
|a jelenlegit folytatja – rollback esetén csak a <code>SAVEPOINT</code>-ig áll vissza | |||
|– | |||
|- | |||
|'''<code>REQUIRES_NEW</code>''' | |||
|felfüggeszti | |||
|újat hoz létre | |||
|új tranzakciót használ | |||
|– | |||
|- | |||
|'''<code>SUPPORTS</code>''' | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|azt folytatja | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>MANDATORY</code>''' | |||
|azt folytatja | |||
|kivételt dob | |||
|azt folytatja | |||
|– | |||
|- | |||
|'''<code>NOT_SUPPORTED</code>''' | |||
|felfüggeszti | |||
|– | |||
|– | |||
|tranzakció nélkül fut | |||
|- | |||
|'''<code>NEVER</code>''' | |||
|kivételt dob | |||
|tranzakció nélkül fut | |||
|– | |||
|tranzakció nélkül fut | |||
|} | |||
== 8. ASP.NET Core == | == 8. ASP.NET Core == | ||
{{Átnézendő szakasz}} | |||
=== Mi az ASP.NET Core? === | === Mi az ASP.NET Core? === | ||
... | Az ASP.NET Core egy .NET-alapú nagyteljesítményű, nyílt forráskódú, platformfüggetlen webalkalmazás‑framework. | ||
=== Mit jelent, hogy egy alkalmazás monolitikus? === | === Mit jelent, hogy egy alkalmazás monolitikus? === | ||
... | Monolitikusnak nevezzük azt az alkalmazást, amelynek összes komponense – pl. UI, üzleti logika és adatkezelés – egyetlen deploy‑egységben (pl. egy futtatható vagy szerveralkalmazásban) fut, nem részeire bontva. | ||
=== Mi a ''clean architecture''? === | === Mi a ''clean architecture''? === | ||
... | A clean architecture egy szoftvertervezési minta, melynek alapvetése a kód rétegekre (pl. domain, application, infrastructure, presentation) bontása. Alkalmazza a dependency inversiont is: a külső rétegek függnek csak az absztrakcióktól, nem fordítva. | ||
=== Sorolj fel min. 3 általános ASP.NET Core által nyújtott | === Sorolj fel min. 3 általános, ASP.NET Core által nyújtott infrastruktúrafunkciót! === | ||
... | * beépített DI | ||
* middleware alapú HTTP–pipeline-kezelés (pl. autentikáció, logging) | |||
* konfigurálhatóság (<code>appsettings.json</code> + környezeti változók) | |||
* moduláris hosting (pl. Kestrel), cross‑platform deployment (IIS, Nginx, Docker stb.) | |||
=== Hogyan indul el egy ASP.NET Core projekt? === | === Hogyan indul el egy ASP.NET Core projekt? === | ||
.. | # <code>dotnet new webapi</code> vagy <code>dotnet new mvc</code> parancs | ||
# a <code>Program.cs</code> és/vagy <code>Startup.cs</code> definiálja a hosztot, regisztrálja a service‑eket és a middleware‑eket | |||
# a <code>dotnet run</code> indítja el a Kestrel szervert | |||
# elérhető az alkalmazás | |||
=== Milyen lépései vannak, hogy egy Web API-n kiajánljunk egy EF Core által nyújtott adatmodellt (lekérdezésre, módosításra)? === | === Milyen lépései vannak, hogy egy Web API-n kiajánljunk egy EF Core által nyújtott adatmodellt (lekérdezésre, módosításra)? === | ||
... | # projekt generálása (<code>dotnet new webapi</code>) | ||
# EF Core-csomagok telepítése (<code>Microsoft.EntityFrameworkCore</code>, SQL server provider) | |||
# <code>DbContext</code> osztály és entitásmodellek létrehozása | |||
# <code>AddDbContext<...>(...)</code> DI a <code>Program.cs</code>-ben / <code>Startup.cs</code>-ben | |||
# kontroller létrehozása (<code>ApiController</code>), mely injektálja a <code>DbContext</code>‑et | |||
# lekérdező metódusok írása: <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code> endpointok | |||
# használat: <code>context.Entities.ToList()</code>, <code>Find(id)</code>, <code>Add()</code>, <code>Update()</code>, <code>Remove()</code>, majd <code>SaveChanges()</code> | |||
== 9. Razor == | == 9. Razor == | ||
{{Átnézendő szakasz}} | |||
=== Milyen módokon szeparálhatjuk a kliens–szerver alkalmazásrétegeket? === | === Milyen módokon szeparálhatjuk a kliens–szerver alkalmazásrétegeket? === | ||
... | * tiszta szerveroldali renderelés – minden HTML generálását a szerver végzi (pl. ASP.NET MVC, Razor Pages). | ||
* tiszta kliensoldali alkalmazás (SPA) – az UI a böngészőben fut, a szerveren csak API-szolgáltatás van (pl. Angular, React). | |||
* hibrid megközelítés – a kezdeti renderelés szerveren történik, utána a kliens veszi át az irányítást (Pl. Blazor Server, SSR + CSR kombinációk) | |||
=== Mi a szerveroldali renderelés? === | === Mi a szerveroldali renderelés? === | ||
. | A szerver generálja az egész HTML-t a kérésre, és küldi el a kliensnek. Így a böngésző azonnal meg tudja jeleníteni a teljes oldalt. | ||
=== Milyen előnyei/hátrányai vannak a kliensoldalival szemben? === | === Milyen előnyei/hátrányai vannak a kliensoldalival szemben? === | ||
==== Előnyök ==== | |||
* gyorsabb első betöltés – kész HTML érkezik | |||
* jobb SEO-támogatás | |||
==== Hátrányok ==== | |||
* magasabb szerverterhelés, minden kérésnél újrarenderelés | |||
* lassabb interaktivitás és navigáció a teljes oldalletöltések miatt | |||
=== Mi a Razor? === | === Mi a Razor? === | ||
... | A Razor egy HTML-templating szintaxis C# (vagy VB) integrálásával; 2010 óta része az ASP.NET MVC-nek / ASP.NET Core‑nak. <code>.cshtml</code> / <code>.razor</code> fájlokban használatos. | ||
=== Hogyan készül el egy HTML-oldal Razor segítségével és MVC vagy Razor Pages használatával? === | === Hogyan készül el egy HTML-oldal Razor segítségével és MVC vagy Razor Pages használatával? === | ||
==== MVC ==== | |||
# létre kell hozni egy <code>Controller</code> metódust return <code>View(model);</code>-lel | |||
# a <code>ViewName.cshtml</code> fájlban Razor-kód (<code>@model</code>, <code>@foreach</code> stb.) generálja a HTML-t | |||
==== Razor Pages ==== | |||
# létre kell hozni egy <code>.cshtml</code> fájlpárt (<code>Index.cshtml</code> + <code>Index.cshtml.cs</code>), ahol: | |||
## a <code>*.cshtml.cs</code> tartalmazza az oldal logikáját az <code>OnGet()</code> és <code>OnPost()</code> metódusokkal | |||
## a <code>*.cshtml</code> Razor-jelölésekkel hivatkozik a <code>@Model</code> objektumra | |||
== 10. Microservices == | == 10. Microservices == | ||
| 1 365. sor: | 1 539. sor: | ||
=== A számítási felhő fő jellemzői === | === A számítási felhő fő jellemzői === | ||
* önkiszolgálás bármikor | |||
* nagy rugalmasság | |||
** skálázhatóság | |||
*** akár egy komplex vállalati rendszer is kialakítható | |||
** számlázás fogyasztás alapján | |||
* felhasználók közt megosztott erőforrások | |||
* széleskörű hálózati elérés | |||
** internet | |||
** IoT | |||
=== A számítási felhő fizikai, térbeli kiépítése === | === A számítási felhő fizikai, térbeli kiépítése === | ||
==== Fizikai ==== | |||
* nagy, légkondicionált raktárépületek | |||
* bennük általában már "csak" előreszerelt konténerekkel | |||
==== Térbeli ==== | |||
A nagyobbtól a kisebbig: | |||
* region | |||
* availability zone | |||
** redundancia | |||
* data center | |||
=== Főbb publikus felhőszolgáltatók === | === Főbb publikus felhőszolgáltatók === | ||
* AWS | |||
* Microsoft Azure | |||
* Google Cloud | |||
* OVH (EU) | |||
=== Felhős szolgáltatásmodellek === | === Felhős szolgáltatásmodellek === | ||
. | |||
* infrastructure as a service | |||
* platform as a service | |||
* software as a service | |||
{| class="wikitable" | |||
|+Üzemeltetési modellek (a más által kezelttől a saját kezelésűig) | |||
!típus | |||
!jellemzői | |||
!példa | |||
|- | |||
|nyilvános | |||
| | |||
* más által üzemeltetett | |||
* szabadon elérhető | |||
|ld.: ''[[Háttéralkalmazások/Záróvizsgatételek#Főbb publikus felhőszolgáltatók|Főbb publikus felhőszolgáltatók]]'' | |||
|- | |||
|hibrid | |||
| | |||
* nyilvános szolgáltatás | |||
* saját környezetben | |||
|Azure Stack Hub, AWS Outposts | |||
|- | |||
|közösségi | |||
| | |||
* egy csoport tagjai közt megosztott, zárt infrastruktúra | |||
|EESZT | |||
|- | |||
|saját | |||
| | |||
* saját szolgáltatás | |||
* saját környezetben | |||
|– | |||
|} | |||
=== Szolgáltatásgaranciák (SLA) === | === Szolgáltatásgaranciák (SLA) === | ||
* magas uptime | |||
* redundancia | |||
** áramellátás | |||
** hálózat | |||
** hardver | |||
*** tárhely | |||
** földrajzi | |||
*** természeti katasztrófák | |||
=== Skálázási lehetőségek === | === Skálázási lehetőségek === | ||
* vertikális | |||
** erőforrások növelése | |||
* horizontális | |||
** példányok bővítése | |||
* automatikusan is lehet | |||
=== Példák elérhető szolgáltatásokra === | === Példák elérhető szolgáltatásokra === | ||
* AWS | |||
** S3 | |||
** SQS | |||
** EC2 | |||
* Google | |||
** Pub/Sub | |||
=== A felhős modell előnyei, hátrányai === | === A felhős modell előnyei, hátrányai === | ||
{| class="wikitable" | |||
|+Összehasonlítás | |||
!előny | |||
!hátrány | |||
|- | |||
|költséghatékony | |||
|drágább is lehet | |||
|- | |||
|használatalapú árazás | |||
|bonyolult árazás | |||
|- | |||
|könnyen skálázható | |||
|nem végtelenül skálázható | |||
|- | |||
|SLA | |||
|a nagyon magas SLA-kért többet kell fizetni | |||
|- | |||
|menedzselt üzemeltetés és biztonság (DRP) | |||
|nem férünk hozzá fizikailag a szerverekhez | |||
|- | |||
|globális | |||
|helyi adatvédelmi megfelelőség esetleges hiánya | |||
|- | |||
|sokféle szolgáltatás | |||
|vendor lock-in (breaking changes) | |||
|} | |||
== 13. Azure == | == 13. Azure == | ||
{{Átnézendő szakasz}} | |||
=== Azure alapszolgáltatások viszonya egymáshoz === | === Azure alapszolgáltatások viszonya egymáshoz === | ||
==== Előfizetés ==== | ==== Előfizetés ==== | ||
Azure-szolgáltatások igénybevételének elszámolási és hozzáférési egysége; egy Azure-fiók alatt több előfizetés is lehet, és az éves költési korlátok is erre épülnek. | |||
==== AD ==== | ==== AD ==== | ||
Identitás- és jogosultságkezelés központja, amelyhez előfizetések, felhasználók és szolgáltatások (alkalmazásregisztrációk) kapcsolódnak. | |||
==== Fiók (account) ==== | ==== Fiók (account) ==== | ||
Microsoft-fiók vagy szervezeti (Azure AD) fiók, amellyel be lehet jelentkezni és kapcsolatba lehet hozni az Azure-előfizetéseket. | |||
==== Erőforráscsoport ==== | ==== Erőforráscsoport ==== | ||
. | Logikai gyűjtőkonténer az előfizetésen belül, amelybe kapcsolódó erőforrásokat, pl. VM-eket vagy adatbázisokat csoportosítunk; segíti az RBAC-t és a költségkövetést. | ||
==== Erőforrás ==== | ==== Erőforrás ==== | ||
. | Valós szolgáltatásobjektum (pl. virtuális gép, tárhely, SQL-adatbázis), amely egy előfizetésen belül erőforráscsoportban jön létre. | ||
=== Erőforrások beállítható alapjellemzői === | === Erőforrások beállítható alapjellemzői === | ||
.. | * '''név''' – globálisan vagy az előfizetésen belül egyedi azonosító | ||
* '''régió''' – földrajzi hely (pl. <code>eastus</code>, <code>westeurope</code>) | |||
* '''típus és SKU''' – szolgáltatás rétegének és teljesítményének kiválasztása (pl. basic, standard) | |||
* '''címkék''' – kulcs–érték párok a költség- és szervezési szempontú csoportosításhoz | |||
=== Régió kiválasztásának szempontjai === | === Régió kiválasztásának szempontjai === | ||
. | * késleltetés | ||
* szabályozás és megfelelőség | |||
** egyes adattípusokra helyhez kötött tárolási előírások vonatkozhatnak | |||
* elérhetőség | |||
** nem minden régió támogat minden szolgáltatást. | |||
* költségek | |||
** régiónként eltérő árszintek lehetnek. | |||
=== Azure SQL és Azure App Service szolgáltatások... === | === Azure SQL és Azure App Service szolgáltatások... === | ||
==== ...bemutatása. ==== | ==== ...bemutatása. ==== | ||
... | * '''Azure SQL Database:''' teljesen menedzselt relációsadatbázis-szolgáltatás automatikus mentéssel, patcheléssel, méretezéssel és beépített teljesítményoptimalizálással. | ||
* '''Azure App Service:''' PaaS típusú app hosting szolgáltatás .NET, Java, Node.js, Python stb. számára. Könnyen skálázható és CI/CD-támogatott. | |||
==== ...felépítése (logikai) erőforrások szintjén. ==== | ==== ...felépítése (logikai) erőforrások szintjén. ==== | ||
* '''Azure SQL''': logikai SQL-szerver → adatbázis(ok) (→ Elastic Pool) | |||
* '''Azure App Service''': App Service Plan (compute és scale) → Web App → deployment slots, konfigurációk stb. | |||
==== ...árazási tényezői. ==== | ==== ...árazási tényezői. ==== | ||
* '''Azure SQL''': vCore- vagy DTU-alapú teljesítmény, adattárolás mérete, elérhetőség (zóna-redundancia), licencek (Azure Hybrid Benefit) | |||
* '''App Service''': service plan típusa (free, shared, basic, standard, premium, isolated), példányszám, skálázás típusa (manual, autoscale), operációs rendszer (Windows / Linux) | |||
A lap jelenlegi, 2025. július 1., 07:56-kori változata
1. Adatbázisok
Ismertesse az adatbáziskonkurencia-problémákat!
- dirty read
- uncommitted tranzakciók által frissített sorok kiolvasása
- non-repeatable read
- committed tranzakciók által frissített sorok kiolvasása
- a tranzakció előtt és után kiolvasott értékek nem egyeznek
- committed tranzakciók által frissített sorok kiolvasása
- phantom read
- committed tranzakciók által hozzáadott / eltávolított sorok kiolvasása
- a tranzakció előtt és után kiolvasott értékek nem egyeznek
- committed tranzakciók által hozzáadott / eltávolított sorok kiolvasása
Ismertesse a tranzakciók alaptulajdonságait!
- ACID:
- atomicity
- minden tranzakció egy egység
- ha egy tranzakció valamely része elhasal, akkor az egész sikertelennek minősül
- consistency
- az illegal transactionök nem mennek végbe
- a kulcsok mindig helyesek
- a megkötések (
NOT NULL,UNIQUE,CASCADEstb.) be vannak tartva - a triggerek az előírtaknak megfelelően működnek
- isolation
- a párhuzamosan futó tranzakciók az izolációs szintnek megfelelő adatokat olvassanak ki
- durability
- a tranzakciók végrehajtása utáni állapot egy rendszerhiba vagy üzemzavar esetén is megmaradjon
- atomicity
Mire szolgálnak a tranzakcióizolációs-szintek?
| izolációs szint | dirty read | non-repeatable read | phantom read |
|---|---|---|---|
| read uncommitted | 🔴 | 🔴 | 🔴 |
| read committed | 🟢 | 🔴 | 🔴 |
| repeatable read | 🟢 | 🟢 | 🔴 |
| serializable | 🟢 | 🟢 | 🟢 |
Ezeket az SQL-92 (ISO-)szabvány tartalmazta először.
Milyen izolációs szinteket támogat az Microsoft SQL Server?
A fentieket, plusz egy snapshot szintet, ami egy segédadatbázis (tempdb) segítségével számon tartja az egyes sorok verzióit, így a tranzakciók az azok kezdetekor készített pillanatkép alapján végeznek műveletet az adatbázisban. Előnye, hogy lockok nélkül működik. Hátránya, hogy a tempdb-nek magas lehet az erőforrásigénye, illetve egy esetleges írásütközés esetén kivételt dob az RDBMS, amit kezelni kell.
2. Tárolt eljárások
Ismertesse az adatbázisok szerveroldali programozásának koncepcióját, előnyeit, hátrányait!
Használatával eljárásokat (procedures) és függvényeket (functions), illetve triggereket lehet tárolni az adatbázisban. Lényege, hogy az üzleti logika helyett maga az adatbázis-kezelő szerver futtatja a beállított szubrutinokat, az előbbi csak meghívja őket.
| szempont / tulajdonság | ➕ | ➖ |
|---|---|---|
| teljesítmény |
|
|
| szabvány |
| |
| adatbiztonság |
|
|
| az üzleti logika bárhonnan meghívhatja a szubrutinokat |
|
|
Milyen programozási lehetőségei, sajátosságai vannak a Microsoft SQL Servernek?
A Microsoft SQL Server procedurális programozási nyelve a T(ransact)-SQL. Azokban változókat, operátorokat, elágazásokat, utasításblokkokat, ciklusokat és kivételeket is lehet használni.
Egyedi adatbetöltési eszköze a kurzor. Gyakorlatilag úgy működik, mintha lenne egy Excel-táblázatunk, amit egy olyan Maccel szeretnénk kiolvasni, amihez csak egy ▼ billentyű van csatlakoztatva. Meg kell nyitni a táblázatot, utána egyesével végig lehet léptetni az adatokon. Az utolsó sort elérve be kell zárni az ablakot (= a kurzort), majd magát a programot is, hogy felszabadítsuk az erőforrásokat (DEALLOCATE cursor1).
A függvények skalár értékekkel (változókkal) vagy táblákkal térhetnek vissza.
A triggerek DML- és DDL-utasításokat is végrehajthatnak.
| típus | van visszatérési értéke? | van mellékhatása? |
|---|---|---|
| eljárás | 🟠 lehet | 🟠 lehet |
| függvény | 🟢 igen, mindig | 🔴 nem, soha |
3. ORM
Mi az O/R leképzés feladata, mire szolgálnak a shadow-információk?
Az ORM segítségével egy objektumorientált nyelv memóriájában tárolt objektumokat le lehet képezni egy relációs adatbázis sémájára (és fordítva). Ezzel hidat képez az adatbázis és az üzleti logika között, biztosítva utóbbi adatperzisztenciáját.
A shadow-információk az adatbázisban szükséges, de az üzleti logika által nem használt kulcsokat, időbélyegeket és egyéb adatokat takarják.
| üzleti logika | adatbázis |
|---|---|
| osztály | tábla |
| tagváltozó (primitive) | oszlop (attribútum) |
| tagváltozó (objektum) | oszlop (attribútum), mely egyben idegen kulcs is |
| osztálypéldány | sor (rekord) |
Az öröklési hierarchiát miképp lehet leképezni relációs sémára?
Tegyük fel, hogy van egy absztrakt Vehicle osztályunk. Ebből származik a Tram és a Bus osztály. Be akarunk vezetni egy új ElectricBus osztályt, mely a Bus leszármazottja.
Egy táblába, gányul
| 🔑 id | lpn_or_car_number | is_tram | has_radio_point_switcher | is_bus | rear_engined |
|---|---|---|---|---|---|
| 1 | V1448 | true | false | false | <null> |
| 2 | SGY811 | false | <null> | true | true |
↓
| 🔑 id | lpn_or_car_number | is_tram | has_radio_point_switcher | is_bus | rear_engined | is_electric_bus | traction_battery_capacity_kwh |
|---|---|---|---|---|---|---|---|
| 1 | V1448 | true | false | false | <null> | false | <null> |
| 2 | SGY811 | false | <null> | true | true | false | <null> |
| 3 | NLE848 | false | <null> | false | true | true | 170 |
Külön táblába a valós osztályokat
| 🔑 id | lpn_or_car_number | has_radio_point_switcher |
|---|---|---|
| 1 | V1448 | false |
| 🔑 id | lpn_or_car_number | rear_engined |
|---|---|---|
| 1 | SGY811 | true |
➕
| 🔑 id | lpn_or_car_number | rear_engined | traction_battery_capacity_kwh |
|---|---|---|---|
| 1 | NLE848 | true | 170 |
Külön táblába az összes osztályt
| 🔑 id | lpn_or_car_number |
|---|---|
| 1 | V1448 |
| 2 | SGY811 |
| 3 | NLE848 |
| 🔑 id | 🔑 🇸🇨 vehicle_id | has_radio_point_switcher |
|---|---|---|
| 1 | 1 | false |
| 🔑 id | 🔑 🇸🇨 vehicle_id | rear_engined |
|---|---|---|
| 1 | 2 | true |
| 2 | 3 | true |
➕
| 🔑 id | 🔑 🇸🇨 bus_id | traction_battery_capacity_kwh |
|---|---|---|
| 1 | 2 | 170 |
Absztrakt struktúrába
Külön tábla az osztályoknak, örökléseknek, tagváltozóknak, azok típusainak és az értékeknek. Mindegyiknek van kapcsolata legalább egy másik táblával.
Hogyan képezzük le az objektumok közötti kapcsolatokat?
Csak a kapcsolatok számosságát lehet leképezni, azok irányát nem. A kapcsolatok akár azonos táblán belül is lehetnek (rekurzió).
| egy | több | |
|---|---|---|
| egy | idegen kulccsal az egyik táblában | |
| több | – | egy külön kapcsolótáblával |
Hogyan képezhetőek le a globális változók?
Gányul
Változónként külön táblában:
| 🔑 id | vat |
|---|---|
| 1 | 0,27 |
| 🔑 id | bank_transaction_tax |
|---|---|
| 1 | 0,0045 |
Vagy akár ezeket osztályonként / teljesen összevonva.
Szépen
Kulcs-érték páronként:
| 🔑 id | class | key | value |
|---|---|---|---|
| 1 | Hungary | vat | 0,27 |
| 2 | Hungary | bank_transaction_tax | 0,0045 |
4. EF
Mi az Entity Framework?
Az Entity Framework egy Microsoft által fejlesztett, ADO.NET-re és .NET Frameworkre épülő ORM-keretrendszer. A 2016-ban kiadott, .NET Core-alapon újraírt, nyílt forráskódú verzió neve Entity Framework Core. A Java nyelvbeli megfelelője a Jakarta Persistence.
Teljesen moduláris, az egyes részeit NuGet-csomagokból lehet importálni. A JDBC-hez hasonlóan drivereket biztosít az egyes RDBMS-ekhez. Az ORM mellett a LINQ-eket futásidőben SQL-kódra fordítja le és hajtja végre.
Mikor használjuk, és mikor nem?
Mikor nem használjuk
- legacy kódban, ami közvetlenül használja az ADO.NET-et, és nyers SQL-parancsok szerepelnek benne, amiket nem éri meg migrálni EF-be
- teljesítménykritikus környezetekben, ahol
- nem megengedhető az ORM overheadje
- nem bízható rá az SQL-parancsok generálása az EF-re (pl. költségoptimalizálás miatt)
- tömeges műveleteknél
Mikor használjuk
Avagy mik az előnyei:
- ORM
- LINQ
- kódból történő migrációk (sémafrissítés)
- lazy loading
- párhuzamosság és konkurenciakezelés
- előre lefordított és cache-elt lekérdezések
Mi a DbContext?
Egy EF Core-beli osztály, mely egy adatbázis-munkamenetet reprezentál.
Általában a DAL-ban hozunk létre egy DbContext-ből leszármazó osztályt. Mivel a DbContext vezeti a nyilvántartást az entitáspéldányokról, azok felderítésében segíti, ha DbSet<Entity> tagváltozókat is megadunk a DAL-osztályban. Egy DbContextOptions objektum átadásával – mely tartalmazza az adatbázis típusát és connection stringjét – lehet példányosítani.
A service layernek DI-vel adjuk át a DbContext-et, és annak tagfüggvényeit meghívva lehet LINQ-ket futtatni.
Milyen három modellezési lehetőségünk van adatmodell készítésére?
| példa | előnyei | |
|---|---|---|
| automatikus | public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Isbn { get; set; }
}
|
|
| annotációk | public class Book
{
public int Id { get; set; }
public string Title { get; set; }
[Unicode(false)]
[MaxLength(22)]
public string Isbn { get; set; }
}
|
|
| Fluent API | protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>()
.Property(b => b.Isbn)
.IsUnicode(false);
}
|
|
Milyen két lehetőségünk van a modell konfigurációjára?
Code first
| lépés | ki / mi készíti? | |
|---|---|---|
| 1. | OO-modell | a fejlesztő C#-ban |
| 2. | ORM | |
| 3. | DB-objektumok | EF Core Migration Tool |
Database first
| lépés | ki / mi készíti? | |
|---|---|---|
| 1. | DB-objektumok | a fejlesztő SQL-ben |
| 2. | ORM | EF Core Reverse Engineering Tool |
| 3. | OO-modell |
Hogy néz ki egy entitás, hogyan készítünk kapcsolatokat közöttük?
| 1:N | N:N | |
|---|---|---|
| annotációkkal | Entitások:public class Blog
{
[Key]
public int Id { get; set; }
public string Title { get; set; } = null!;
public List<Post> Posts { get; set; } = new();
}
public class Post
{
[Key]
public int Id { get; set; }
public string Content { get; set; } = null!;
[ForeignKey(nameof(Blog))]
public int BlogId { get; set; }
public Blog Blog { get; set; } = null!; // parent navigation
}
|
Entitások:public class Student
{
[Key]
public int Id { get; set; }
public string Name { get; set; } = null!;
public List<Enrollment> Enrollments { get; set; } = new();
}
public class Course
{
[Key]
public int Id { get; set; }
public string Title { get; set; } = null!;
public List<Enrollment> Enrollments { get; set; } = new();
}
public class Enrollment
{
[ForeignKey(nameof(Student))]
public int StudentId { get; set; }
public Student Student { get; set; } = null!;
[ForeignKey(nameof(Course))]
public int CourseId { get; set; }
public Course Course { get; set; } = null!;
public DateTime EnrolledOn { get; set; }
}
|
| Fluent API-val | Entitások:public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public List<Post> Posts { get; set; } = new();
}
public class Post
{
public int Id { get; set; }
public string Content { get; set; }
public int BlogId { get; set; } // foreign key
public Blog Blog { get; set; } = null!; // parent navigation
}
DbContext:protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId);
}
|
Entitások:public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public List<Course> Courses { get; set; } = new();
}
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public List<Student> Students { get; set; } = new();
}
DbContext:protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasMany(s => s.Courses)
.WithMany(c => c.Students)
.UsingEntity("StudentCourse");
}
|
Hogyan készítünk lekérdezéseket, hogyan módosítunk adatokat EF Core-ban?
A Dogs entitás példáját véve:
| típus | dbContext-függvényhívás
|
|---|---|
| összes találat | .Any(d => !d.Ownerships.Any())
|
| számlálás | .Any(…).Count()
|
| projekció | .Select(d => d.Name)
|
| csoportos projekció és spread | .SelectMany(d => d.Ownerships)
|
| szelekció | .Where(d => d.Name == "Bodri")
vagy ID alapján:
|
| egyetlen találat | .Single(d => d.Name == "Bodri")
vagy
|
| első találat | .First(d => d.Name == "Bodri")
vagy
|
| csoportosítás | .GroupBy(d => d.Ownerships.Count())
|
| rendezés | .OrderBy(d => d.Ownerships.Count())
|
| lapozás | .Skip(20)
és
|
| CRUD | dbContext-függvényhívás
|
|---|---|
| create | .Dogs.Add(newDog);
|
| read | ld. az előző táblázatot |
| update | .Dogs.Find(dogId);
|
| delete | adatbetöltéssel:
az előző táblázatból bármit meghívni az első találat sorig, majd utána |
...majd utána dbContext.SaveChanges();.
5. JPA – általános
Ismertesd a Java Persistence API architektúráját és főbb jellemzőit!
A JPA egy Java ORM-interfészspecifikáció, melyet az Eclipse Foundation tart karban. 2020 óta már Jakarta Persistence a neve.[2]
Egyik implementációja a Hibernate, .NET-es megfelelője pedig a .NET Persistence API.
Architektúra
┌──────────────────────────┐
│ 1. osztályok (entitások) │ ← annotációkkal ellátva
└──────────────────────────┘
↓
┌─────────────────────────────┐
│ 2. perzisztenciabeállítások │ ← a persistence.xml-ben vagy a kódban
└─────────────────────────────┘
↓
┌─────────────────────────┐
│ 3. EntityManagerFactory │ ← elindítja a JPA providert
└─────────────────────────┘
↓
┌──────────────────┐
│ 4. EntityManager │ ← futásidőben kezeli a perzisztenciakontextust (tranzakciókat, gyorsítótárat stb.)
└──────────────────┘
↓
┌───────────────────┐
│ 5. adatbázisréteg │
│ - JDBC API │
│ - JDBC driver │
│ - RDBMS │
└───────────────────┘Az elsőt "csak" használja a JPA, a 2–4. elemek pedig a szerves részei.
Milyen annotációkat kell alkalmazni egy JPA-entitás megírásakor?
@Entity@Id
Szükség esetén:
@GeneratedValueaz@Id-hoz
@Table(name=…), illetve@Column(name=…)@Embeddableés@Embedded@Convert(converter=…)
Milyen típusú attribútumokat vehetünk fel benne?
- primitívek és TitleCase wrappereik
- szövegek
Stringchar[]ésCharacter[]
- számok
BigIntegerésBigDecimal
- idő
Calendar,Date,Time,Timestampstb.java.util.*esetén kötelező használni a@Temporal(DATE/TIME/TIMESTAMP)-et- egyéb esetben ajánlott
- Enum
@Enumerated(ORDINAL/STRING)szükséges
- nyers adatok
byte[]ésByte[]- nagyobb adatok esetén
@Lobszükséges, hogyBLOB-ként tárolja őket
Ismertesd a perzisztenciakontextus fogalmát!
A perzisztenciakontextus a perzisztenciaszolgáltató által kezelt, memóriabeli entitások egy része. Hozzáférést biztosít az adatbázishoz az üzleti logikában. A JPA-ban az EntityManager, az EF Core-ban pedig a DbContext végzi ezt a feladatot.
Egy perzisztenciakontextus belül egy objektum csak egyetlen példányban létezhet.
Mutasd be az entitások életciklusát!
Állapotok
| a DB-ben | |||
|---|---|---|---|
| nem létezik | létezik | ||
| a memóriában (perzisztenciakontextusban) | nem létezik | – | lecsatolt |
| létezik | új | menedzselt vagy törölt | |
Állapotátmenetek
│
│
new() │
│
▼
┌──────────────┐
│ │
│ új │
│ │
└──────────────┘
│
│
persist() │ merge()
│
▼
┌───────────────┐remove() ┌──────────────┐
┌────►│ │────────────►│ │
refresh() │ │ menedzselt │ │ törölt │
└─────│ │◄────────────│ │
└───────────────┘ persist()└──────────────┘
│ ▲
megszűnik a │ │
perzisztenciakontextus │ │
│ │ merge()
▼ │
┌──────────────┐
│ │
│ lecsatolt │
│ │
└──────────────┘6. JPA – használat
Milyen módokon lehet lekérdezést megfogalmazni a JPA-ban?
| komplexitás | módszer | példa |
|---|---|---|
| egyszerű | elsődleges kulcs alapján | Person p = entityManager.find(Person.class, 42L);
|
| feltételekkel | Criteria API | CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root)
.where(cb.equal(root.get("name"), "David"));
Person p = entityManager.createQuery(cq).getSingleResult();
|
| Query by Example[3] | Person probe = new Person();
ExampleMatcher matcher = ExampleMatcher
.matching()
.withMatcher("firstName", match -> match.regex().ignoreCase());
probe.setFirstName("^Dav.*");
Example<Person> example = Example.of(probe, matcher);
List<Person> results = repo.findAll(example);
| |
| nyersen
(el is lehet nevezni őket) |
JPQL | TypedQuery<Person> q = entityManager.createQuery(
"SELECT p FROM Person p WHERE p.age > :age", Person.class
);
q.setParameter("age", 30);
List<Person> list = q.getResultList();
|
| SQL | List<Object[]> rows = entityManager.createNativeQuery(
"SELECT first_name, last_name FROM person WHERE age > :min"
)
.setParameter("min", 30)
.getResultList();
for (Object[] row : rows) {
String firstName = (String) row[0];
String lastName = (String) row[1];
}
|
Hogyan bővíti a lehetőségeket a Spring Data JPA a lekérdezések megfogalmazásának területén?
| jellemző | példakód | miben segít? |
|---|---|---|
| repositoryk
használata |
interface BusRepository extends JpaRepository<Bus, Long> { }
|
|
| konvenciók
használata |
List<Bus> findByLpn(String lpn);
| |
| rendezés
és lapozás támogatása |
interface BusRepository extends PagingAndSortingRepository<Bus, Long> {
Iterable<Bus> findAll(Sort sort);
Page<Bus> findAll(Pageable pageable);
}
| |
| egyedi
lekérdezés |
@Query("SELECT DISTINCT b FROM Bus b WHERE b.lpn LIKE :lpn")
|
|
Hogyan valósíthatók meg entitások közti kapcsolatok és az entitások öröklése JPA-ban?
Kapcsolatok
| típus | egyirányú | kétirányú |
|---|---|---|
@OneToOne
|
@Entity
class A {
@OneToOne
@JoinColumn(name="b_id")
B b;
}
@Entity
class B {
@Id
Long id;
}
|
@Entity
class A {
@OneToOne
@JoinColumn(name="b_id")
B b;
}
@Entity
class B {
@OneToOne(mappedBy="b")
A a;
}
|
@OneToMany
és
|
@Entity
class A {
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="a_id")
List<B> bs;
}
@Entity
class B {
@Id
Long id;
}
|
@Entity
class A {
@OneToMany(
mappedBy="a",
cascade=CascadeType.ALL,
orphanRemoval=true
)
List<B> bs;
}
@Entity
class B {
@ManyToOne
@JoinColumn(name="a_id")
A a;
}
|
@ManyToMany
|
@Entity
class A {
@ManyToMany
@JoinTable(
name="A_B",
joinColumns=
@JoinColumn(name="a_id"),
inverseJoinColumns=
@JoinColumn(name="b_id")
)
Set<B> bs;
}
@Entity
class B {
@Id
Long id;
}
|
@Entity
class A {
@ManyToMany
@JoinTable(
name="A_B",
joinColumns=
@JoinColumn(name="a_id"),
inverseJoinColumns=
@JoinColumn(name="b_id")
)
Set<B> bs;
}
@Entity
class B {
@ManyToMany(mappedBy="bs")
Set<A> as;
}
|
Öröklés
| módszer | @Inheritance(strategy = …)
|
|---|---|
| egy táblába, gányul | SINGLE_TABLE
|
| külön táblába a valós osztályokat | TABLE_PER_CLASS
|
| külön táblába az összes osztályt | JOINED
|
| absztrakt struktúrába | – |
@Idattribútuma csak a legfelső ősnek lehet- absztrakt is lehet egy entitás
- de természetesen nem lehet példányosítani
- nem-entitásból is származhat entitás
- ha szükségünk van az örökölt attribútumokra, akkor
@MappedSuperClassannotációt kell tenni az ősre
- ha szükségünk van az örökölt attribútumokra, akkor
- entitásból is származhat nem-entitás
- de nem "veszi kezelésbe" a JPA
7. Spring
Mik a függőséginjektálás főbb előnyei?
- az injektornak ki van szervezve a függőség betöltése és az objektumgráfok előállítása
- kevesebb kódduplikáció
- könnyű mockolni a függőségeket
Hogyan támogatja a Spring?
A következő annotációkkal:
| lehet injektálni | példa |
|---|---|
| mezőbe | @Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void getAllUsers() {
userRepository.findAll();
}
}
|
| setterbe | @Service
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void getAllUsers() {
userRepository.findAll();
}
}
|
| konstruktorba | @Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void getAllUsers() {
userRepository.findAll();
}
}
|
Más beaneket is lehet injektálni, melyeket kollaborátoroknak hívják. Több lehetséges jelölt esetén konfigurálni kell, hogy melyiket szeretnénk injektálni.
Milyen élettartama lehet egy springes beannek?
| típus | annotáció | minek az életciklusához van kötve |
|---|---|---|
| singleton | – (ez az alapértelmezett) | semminek, csak egy van belőle az egész alkalmazásban |
| application | @Scope("application")
|
ServletContext[4]
|
| prototype | @Scope("prototype")
|
új példány jön létre minden getBean() (@Autowired) hívásra
|
| websocket | @Scope(scopeName="websocket", proxyMode=...)
|
WebSocket session
|
| session | @Scope("session")
|
HTTP session |
| request | @Scope("request")
|
HTTP-kérés |
Hogyan könnyíti meg a JPA használatát a Spring Data JPA?
Hogyan támogatja a tranzakciókezelést a Spring?
Egységes API-ja van, ami mögé ezeket a tranzakciókezelőket lehet berakni:
| típus | jellemzői |
|---|---|
| JDBC | – |
| EntityTransaction (JPA) | ld.: Ismertesd a Java Persistence API architektúráját és főbb jellemzőit! |
| JDO (Java Data Objects) | a JTA elődje |
| JTA (Jakarta Transactions) | szolgáltatásokon átívelő tranzakciókat lehet végrehajtani |
| típus | hogyan indítjuk /
zárjuk le a tranzakciókat? |
példa |
|---|---|---|
| programozott | a kódban | @Service
public class OrderService {
private final PlatformTransactionManager transactionManager;
public OrderService(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void processOrder() {
TransactionStatus transactionStatus = transactionManager
.getTransaction(new DefaultTransactionDefinition());
try {
validateOrder();
chargeCustomer();
saveOrderToDatabase();
transactionManager.commit(transactionStatus);
System.out.println("Transaction committed successfully!");
} catch (RuntimeException ex) {
transactionManager.rollback(transactionStatus);
System.out.println(
"Transaction was rolled back due to the following error: " + ex.getMessage()
);
}
}
}
|
| deklaratív | metódusannotációkkal | @Service
public class OrderService {
@Transactional
public void processOrder() {
validateOrder();
chargeCustomer();
saveOrderToDatabase();
// kezeletlen kivétel esetén a Spring automatikusan rollbackel
}
}
|
| paraméter | értéke |
|---|---|
(no)rollbackFor(ClassName)
|
milyen kivételek esetén legyen rollback |
timeout
|
az időkorlát másodpercben |
isolation
|
izolációs szint (a JPA nem támogatja) |
value
|
a tranzakciókezelő azonosítója (több adatbázis esetén fontos) |
propagation
|
kompatibilitás egy tranzakcionális metódusból hívott másik tranzakcionális metódussal |
| érték | mit tesz a jelenlegi függvény... | mi történik a következő függvénnyel? | ||
|---|---|---|---|---|
| ...ha van aktív tranzakció? | ...ha nincs aktív tranzakció? | ...ha van aktív tranzakció? | ...ha nincs aktív tranzakció? | |
REQUIRED
(alapértelmezett) |
azt folytatja | újat hoz létre | a jelenlegit folytatja | – |
NESTED
|
folytatódik, és egy SAVEPOINT-ot hoz létre
|
újat hoz létre | a jelenlegit folytatja – rollback esetén csak a SAVEPOINT-ig áll vissza
|
– |
REQUIRES_NEW
|
felfüggeszti | újat hoz létre | új tranzakciót használ | – |
SUPPORTS
|
azt folytatja | tranzakció nélkül fut | azt folytatja | tranzakció nélkül fut |
MANDATORY
|
azt folytatja | kivételt dob | azt folytatja | – |
NOT_SUPPORTED
|
felfüggeszti | – | – | tranzakció nélkül fut |
NEVER
|
kivételt dob | tranzakció nélkül fut | – | tranzakció nélkül fut |
8. ASP.NET Core
Ez a szakasz átnézésre, esetleg javításra szorul. Segíts a szerkesztésében! 
Ha nem tudod, hogyan állj neki, olvasd el az útmutatót!
Mi az ASP.NET Core?
Az ASP.NET Core egy .NET-alapú nagyteljesítményű, nyílt forráskódú, platformfüggetlen webalkalmazás‑framework.
Mit jelent, hogy egy alkalmazás monolitikus?
Monolitikusnak nevezzük azt az alkalmazást, amelynek összes komponense – pl. UI, üzleti logika és adatkezelés – egyetlen deploy‑egységben (pl. egy futtatható vagy szerveralkalmazásban) fut, nem részeire bontva.
Mi a clean architecture?
A clean architecture egy szoftvertervezési minta, melynek alapvetése a kód rétegekre (pl. domain, application, infrastructure, presentation) bontása. Alkalmazza a dependency inversiont is: a külső rétegek függnek csak az absztrakcióktól, nem fordítva.
Sorolj fel min. 3 általános, ASP.NET Core által nyújtott infrastruktúrafunkciót!
- beépített DI
- middleware alapú HTTP–pipeline-kezelés (pl. autentikáció, logging)
- konfigurálhatóság (
appsettings.json+ környezeti változók) - moduláris hosting (pl. Kestrel), cross‑platform deployment (IIS, Nginx, Docker stb.)
Hogyan indul el egy ASP.NET Core projekt?
dotnet new webapivagydotnet new mvcparancs- a
Program.csés/vagyStartup.csdefiniálja a hosztot, regisztrálja a service‑eket és a middleware‑eket - a
dotnet runindítja el a Kestrel szervert - elérhető az alkalmazás
Milyen lépései vannak, hogy egy Web API-n kiajánljunk egy EF Core által nyújtott adatmodellt (lekérdezésre, módosításra)?
- projekt generálása (
dotnet new webapi) - EF Core-csomagok telepítése (
Microsoft.EntityFrameworkCore, SQL server provider) DbContextosztály és entitásmodellek létrehozásaAddDbContext<...>(...)DI aProgram.cs-ben /Startup.cs-ben- kontroller létrehozása (
ApiController), mely injektálja aDbContext‑et - lekérdező metódusok írása:
GET,POST,PUT,DELETEendpointok - használat:
context.Entities.ToList(),Find(id),Add(),Update(),Remove(), majdSaveChanges()
9. Razor
Ez a szakasz átnézésre, esetleg javításra szorul. Segíts a szerkesztésében! 
Ha nem tudod, hogyan állj neki, olvasd el az útmutatót!
Milyen módokon szeparálhatjuk a kliens–szerver alkalmazásrétegeket?
- tiszta szerveroldali renderelés – minden HTML generálását a szerver végzi (pl. ASP.NET MVC, Razor Pages).
- tiszta kliensoldali alkalmazás (SPA) – az UI a böngészőben fut, a szerveren csak API-szolgáltatás van (pl. Angular, React).
- hibrid megközelítés – a kezdeti renderelés szerveren történik, utána a kliens veszi át az irányítást (Pl. Blazor Server, SSR + CSR kombinációk)
Mi a szerveroldali renderelés?
A szerver generálja az egész HTML-t a kérésre, és küldi el a kliensnek. Így a böngésző azonnal meg tudja jeleníteni a teljes oldalt.
Milyen előnyei/hátrányai vannak a kliensoldalival szemben?
Előnyök
- gyorsabb első betöltés – kész HTML érkezik
- jobb SEO-támogatás
Hátrányok
- magasabb szerverterhelés, minden kérésnél újrarenderelés
- lassabb interaktivitás és navigáció a teljes oldalletöltések miatt
Mi a Razor?
A Razor egy HTML-templating szintaxis C# (vagy VB) integrálásával; 2010 óta része az ASP.NET MVC-nek / ASP.NET Core‑nak. .cshtml / .razor fájlokban használatos.
Hogyan készül el egy HTML-oldal Razor segítségével és MVC vagy Razor Pages használatával?
MVC
- létre kell hozni egy
Controllermetódust returnView(model);-lel - a
ViewName.cshtmlfájlban Razor-kód (@model,@foreachstb.) generálja a HTML-t
Razor Pages
- létre kell hozni egy
.cshtmlfájlpárt (Index.cshtml+Index.cshtml.cs), ahol:- a
*.cshtml.cstartalmazza az oldal logikáját azOnGet()ésOnPost()metódusokkal - a
*.cshtmlRazor-jelölésekkel hivatkozik a@Modelobjektumra
- a
10. Microservices
Milyen előnyökkel és hátrányokkal jár a mikroszolgáltatás architektúra a monolitikussal szemben?
Előnyök
Előnye, hogy az alkalmazás modulárissá válik. Ebből következik a...
- kisebb kódbázis
- gyorsabb
- tesztek
- build
- IDE
- könnyebb teszteket írni
- könnyebb bekapcsolódni a munkába
- kisebb csapat tud rajta dolgozni
- kevesebb koordináció szükséges
- gyorsabb
- külön kezelhető szolgáltatások
- többféle technológia használható
- robosztusabb
- terheléselosztás
- SPOF kiküszöbölése
- automatikus újraindítás
- jobb skálázhatóság
- elég a bottleneck(ek)et felskálázni
- gyorsabb indulás
- alacsonyabb terhelés esetén leskálázni is lehet
- elég a bottleneck(ek)et felskálázni
- rugalmasabb frissítések
- könnyebb a rollback is
- részekre bontott költségek
- üzemeltetésnél
- frissítéseknél
- könnyebben eladható a megrendelő számára
- akár egy szolgáltatás teljes újraírása is
- könnyebben eladható a megrendelő számára
Hátrányok
A modularitásnak természetesen vannak hátrányai is. Ezek a következőek:
- komplexebb architektúra, melynek tervezéséhez és üzemeltetéséhez nagyobb szaktudás (pl. utóbbihoz egy képzett DevOpsos) kell
- több (teszt)példány
- több tesztszerver
- azok között több kapcsolat
- a hálózati (szolgáltatások közti) kommunikáció továbbra is kötött
- többféle szerveren is futhatnak
- többféle technológiát is használhatnak
- bonyolultabb a verziókezelés
- nehezebb a kompatibilitás
- nehezebb a CI/CD
- bonyolultabb a deploy
- több (teszt)példány
- több hálózati kommunikáció
- point of faliure
- overhead
- nehezebben megvalósítható atomicitás
- kódduplikáció
Ezekre (részben vagy egészben) megoldást ad...
- egy jól elkészített CI/CD
- egy hálózatkiesésre felkészített szolgáltatás
- a fejlesztőcsapatok közti jó kommunikáció
- közös könyvtárak készítése
- amely megint korlátozza a szolgáltatásokban használható nyelveket
Ismertesd az alábbi microservice tervezési minták céljait, azok előnyeit, hátrányait!
| tervezési minta | leírása | előnyei | hátrányai |
|---|---|---|---|
| shared database | több szolgáltatás egy sémát használ |
|
|
| database per service | mindegyik szolgáltatás külön privát táblát / külön sémát / külön adatbázist használ |
|
|
| database per service + API composition | a külön privát táblák / külön sémák / külön adatbázisok adatait egy új szolgáltatás joinolja |
|
|
| database per service + command query responsibility segregation | a külön privát táblák / külön sémák / külön adatbázisok adatait egy külön szolgáltatás módosítja, és azokat egy read-only view adatbázisban is összegyűjtjük (a master–slave replicationhöz hasonlóan) |
|
|
11. Microservices
Milyen előnyökkel és hátrányokkal jár a mikroszolgáltatás architektúra a monolitikussal szemben?
Ismertesd az alábbi microservice tervezési minták céljait, azok előnyeit, hátrányait!
| tervezési minta | leírása | előnyei | hátrányai |
|---|---|---|---|
| API gateway | az egyes szolgáltatások közvetlen elérése helyett egy átjárót hívjanak meg a kliensek |
|
|
Ismertesd a tanult service discovery mintákat!
| típus | minta | leírása | előnyei | hátrányai | |
|---|---|---|---|---|---|
| a nyilvántartás | vezetése | self registration (push) | minden szolgáltatás maga felelős a regisztrációért és annak törléséért |
|
|
| 3rd party registration | külön komponens felelős a regisztrációért és annak törléséért |
|
| ||
| használata | client-side service discovery | pl. ilyen a round-robin DNS |
|
| |
| server-side service discovery | egy router biztosítja a terheléselosztást |
|
| ||
12. Cloud
A számítási felhő fő jellemzői
- önkiszolgálás bármikor
- nagy rugalmasság
- skálázhatóság
- akár egy komplex vállalati rendszer is kialakítható
- számlázás fogyasztás alapján
- skálázhatóság
- felhasználók közt megosztott erőforrások
- széleskörű hálózati elérés
- internet
- IoT
A számítási felhő fizikai, térbeli kiépítése
Fizikai
- nagy, légkondicionált raktárépületek
- bennük általában már "csak" előreszerelt konténerekkel
Térbeli
A nagyobbtól a kisebbig:
- region
- availability zone
- redundancia
- data center
Főbb publikus felhőszolgáltatók
- AWS
- Microsoft Azure
- Google Cloud
- OVH (EU)
Felhős szolgáltatásmodellek
- infrastructure as a service
- platform as a service
- software as a service
| típus | jellemzői | példa |
|---|---|---|
| nyilvános |
|
ld.: Főbb publikus felhőszolgáltatók |
| hibrid |
|
Azure Stack Hub, AWS Outposts |
| közösségi |
|
EESZT |
| saját |
|
– |
Szolgáltatásgaranciák (SLA)
- magas uptime
- redundancia
- áramellátás
- hálózat
- hardver
- tárhely
- földrajzi
- természeti katasztrófák
Skálázási lehetőségek
- vertikális
- erőforrások növelése
- horizontális
- példányok bővítése
- automatikusan is lehet
Példák elérhető szolgáltatásokra
- AWS
- S3
- SQS
- EC2
- Google
- Pub/Sub
A felhős modell előnyei, hátrányai
| előny | hátrány |
|---|---|
| költséghatékony | drágább is lehet |
| használatalapú árazás | bonyolult árazás |
| könnyen skálázható | nem végtelenül skálázható |
| SLA | a nagyon magas SLA-kért többet kell fizetni |
| menedzselt üzemeltetés és biztonság (DRP) | nem férünk hozzá fizikailag a szerverekhez |
| globális | helyi adatvédelmi megfelelőség esetleges hiánya |
| sokféle szolgáltatás | vendor lock-in (breaking changes) |
13. Azure
Ez a szakasz átnézésre, esetleg javításra szorul. Segíts a szerkesztésében! 
Ha nem tudod, hogyan állj neki, olvasd el az útmutatót!
Azure alapszolgáltatások viszonya egymáshoz
Előfizetés
Azure-szolgáltatások igénybevételének elszámolási és hozzáférési egysége; egy Azure-fiók alatt több előfizetés is lehet, és az éves költési korlátok is erre épülnek.
AD
Identitás- és jogosultságkezelés központja, amelyhez előfizetések, felhasználók és szolgáltatások (alkalmazásregisztrációk) kapcsolódnak.
Fiók (account)
Microsoft-fiók vagy szervezeti (Azure AD) fiók, amellyel be lehet jelentkezni és kapcsolatba lehet hozni az Azure-előfizetéseket.
Erőforráscsoport
Logikai gyűjtőkonténer az előfizetésen belül, amelybe kapcsolódó erőforrásokat, pl. VM-eket vagy adatbázisokat csoportosítunk; segíti az RBAC-t és a költségkövetést.
Erőforrás
Valós szolgáltatásobjektum (pl. virtuális gép, tárhely, SQL-adatbázis), amely egy előfizetésen belül erőforráscsoportban jön létre.
Erőforrások beállítható alapjellemzői
- név – globálisan vagy az előfizetésen belül egyedi azonosító
- régió – földrajzi hely (pl.
eastus,westeurope) - típus és SKU – szolgáltatás rétegének és teljesítményének kiválasztása (pl. basic, standard)
- címkék – kulcs–érték párok a költség- és szervezési szempontú csoportosításhoz
Régió kiválasztásának szempontjai
- késleltetés
- szabályozás és megfelelőség
- egyes adattípusokra helyhez kötött tárolási előírások vonatkozhatnak
- elérhetőség
- nem minden régió támogat minden szolgáltatást.
- költségek
- régiónként eltérő árszintek lehetnek.
Azure SQL és Azure App Service szolgáltatások...
...bemutatása.
- Azure SQL Database: teljesen menedzselt relációsadatbázis-szolgáltatás automatikus mentéssel, patcheléssel, méretezéssel és beépített teljesítményoptimalizálással.
- Azure App Service: PaaS típusú app hosting szolgáltatás .NET, Java, Node.js, Python stb. számára. Könnyen skálázható és CI/CD-támogatott.
...felépítése (logikai) erőforrások szintjén.
- Azure SQL: logikai SQL-szerver → adatbázis(ok) (→ Elastic Pool)
- Azure App Service: App Service Plan (compute és scale) → Web App → deployment slots, konfigurációk stb.
...árazási tényezői.
- Azure SQL: vCore- vagy DTU-alapú teljesítmény, adattárolás mérete, elérhetőség (zóna-redundancia), licencek (Azure Hybrid Benefit)
- App Service: service plan típusa (free, shared, basic, standard, premium, isolated), példányszám, skálázás típusa (manual, autoscale), operációs rendszer (Windows / Linux)
- ↑ Kivéve: https://learn.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/native-compilation-of-tables-and-stored-procedures és https://docs.oracle.com/en/database/oracle/oracle-database/21/jjdev/running-Java-stored-procedures.html
- ↑ https://blogs.oracle.com/javamagazine/post/transition-from-java-ee-to-jakarta-ee
- ↑ Nem tananyag, de Tanár Úr jelezte, hogy a Java 2. házit ennek segítségével lehet megoldani legszebben.
- ↑ Webalkalmazásoknál használatos.
- ↑ Külső eszközökkel történő kommunikáció esetén természetesen autentikáció is szükséges.
